1. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 1 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
Capitulo 3 – Tabelas
Lição 1 – Criando tabelas (Creating tables)
Tabelas formam os blocos de construção das aplicações, definindo as estruturas dos dados que são
armazenados. Quando você está desenvolvendo as tabelas, sua tarefa é criar tabelas que possam
armazenar dados requeridos para os negócios da empresa, no mesmo tempo em que a quantidade de
disco e memória são usados; (Tables form the most granular building blocks of applications, defining the structure of the data that can be
stored. When designing tables, your task is to create the tables that can store the data required by your business applications, while at the same time
minimizing the amount of disk and memory being used)
Schemas (Esquemas)
Schema é um mecanismo para agrupar objetos dentro de um banco de dados, além fazer parte de uma
estrutura de segurança do SQL Server.
Você pode gerenciar cada banco de dados dentro de uma instancia separadamente em termos de
consumo de disco, transações e recursos de memória. Caso seu aplicativo precise ou você precise que o
seu aplicativo acesse vários banco de dados que não precisa estar em instancias separadas, então deve
combinar objetos em um único banco de dados e utilizar schemas para separar grupo de objetos.
A sintaxe mais simples para criar um esquema é:
CREATE SCHEMA <schema name > AUTHORIZATION <owner name>
- Um schema é uma coleção de objetos de um banco de dados que são de um dono (usuário único) e
formam um único namespace;
- Namespace é um agrupamento de objetos que não pode ter nomes duplicados;
- O comando CREATE SCHEMA pode criar schemas contendo tabelas e views;
USE AdventureWorks
GO
CREATE SCHEMA test AUTHORIZATION dbo
GO
Criando um schema
Obs: Pode-se haver tabelas com nomes iguais (objetos) em schemas diferentes;
2. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 2 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
Tipos de dados (Data types)
Embora não seja referido como uma constraint, o tipo de dados de uma coluna é constraint mais
fundamental que você pode especificar para uma tabela. A escolha do tipo de dados restringe o
intervalo de valores possíveis, ao passo que define a quantidade máxima de espaço que será consumido
para a coluna dentro de uma linha;
A escolha do tipo de dados é a decisão de desempenho mais importante que você tomará para um
banco de dados. Você precisa selecionar um tipo que possa armazenar os dados necessários para a
empresa, mas o tipo de dados não deve consumir um único byte de armazenamento a mais do que o
necessário. Em milhares ou milhões de linhas de dados, 1 único byte pode fazer grande diferença de
desempenho. Cada byte desperdiçado também desperdiça seu bem mais precioso: memória no servidor,
pois os dados precisam passar pela memória antes que um aplicativo possa utilizá-lo;
Tipos de dados numéricos
Nove tipos de dados vêm com o SQL Server 2008 e eles são usados para armazenar números inteiros,
monetários e decimais.
3. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 3 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
Tipo de dados Intervalo Armazenamento
bigint -2^63 (-9.223.372.036.854.775.808) a 2^63-1 (9.223.372.036.854.775.807) 8 bytes
int -2^31 (-2.147.483.648) a 2^31-1 (2.147.483.647) 4 bytes
smallint -2^15 (-32.768) a 2^15-1 (32.767) 2 bytes
tinyint 0 a 255 1 byte
Referencia: http://msdn.microsoft.com/pt-br/library/ms187745.aspx
Nota: Os tipos de dados DECIMAL e NUMERIC são exatamente equivalentes. Os dois tipos de dados
ainda existem dentro do SQL Server para compatibilidade com versões anteriores; DECIMAL é ANSI
e NUMERIC é a compatibilidade; O separador de decimal é o símbolo ponto (.) e o de milhar é o
símbolo virgula (,), independente da configuração do Windows. Somente o separador de decimal é
armazenado no campo;
Mais informações em:
http://imasters.com.br/artigo/244/sql_server/tipos_de_dados_no_sql_server_-_parte_1/
http://msdn.microsoft.com/pt-br/library/ms187746.aspx
Os tipos de dados MONEY e SMALLMONEY são feitos especificamente para armazenar valores
monetários com um máximo de quatro casas decimais;
O tipo FLOAT recebe um parâmetro opcional do número de dígitos armazenados após a vírgula
decimal que é chamado mantissa. Se a mantissa é definida entre 1 e 24, então um tipo FLOAT
consome 4 bytes de armazenamento. Se a mantissa é definida entre 25 e 53, então um FLOAT consome
8 bytes de armazenamento;
Nota: Os tipos de dados FLOAT e REAL são classificados como valores numéricos aproximados ou
números em ponto flutuante. O valor armazenado dentro de uma coluna desses tipos dependendo do
processador.
Tipos de dados decimais
Os tipos de dados decimais tem 2 parametros – precisão e escala. A precisão indica o número total de
dígitos que podem ser armazenados à esquerda da vírgula decimal. A escala indica o número máximo à
direita da vírgula decimal ou valores entre -99999,999 e 99999,99;
4. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 4 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
Exemplo:
USE AdventureWorks
GO
CREATE TABLE test.NUMERAIS
(
VALOR1 DECIMAL(4,2),
VALOR2 DECIMAL(5,2),
VALOR3 DECIMAL(4,3)
)
GO
-- inserção correta
INSERT INTO test.NUMERAIS (VALOR1, VALOR2, VALOR3) values (99.21, 999.22, 9.559);
-- simulando erro. O valor3 está incorreto, pois 3 dígitos sao destinados a decimais
INSERT INTO test.NUMERAIS (VALOR1, VALOR2, VALOR3) values (9.58, 99.22, 99.5);
Tipos de dados alfanuméricos
O SQL Server 2008 tem quatro tipos de dados para armazenar dados alfanuméricos (character), com a
escolha de qual usar dependendo de você ter valores de comprimento fixo ou variável e de querer
armazenar dados Unicode ou não Unicode.
5. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 5 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
Exemplo:
USE AdventureWorks
GO
CREATE TABLE test.CARACTERES
(
NOME1 CHAR(02),
NOME2 VARCHAR(10),
NOME3 NCHAR(04),
NOME4 NVARCHAR(10)
)
GO
INSERT INTO test.CARACTERES (NOME1, NOME2, NOME3, NOME4) VALUES ('AA','AAAA','BB','BBBB');
INSERT INTO test.CARACTERES (NOME1, NOME2, NOME3, NOME4) VALUES ('ÁÃ','ÜÃÕÇ','ÁÃ','ÜÃÕÇ');
SELECT * FROM test.CARACTERES
DECLARE @nstring nchar(12)
SET @nstring = N'Ã'
SELECT UNICODE(@nstring), NCHAR(UNICODE(@nstring))
DECLARE @nstring nchar(12)
SET @nstring = (select top 1 substring(nome3,2,1) FROM test.CARACTERES order by nome3 asc)
SELECT UNICODE(@nstring), NCHAR(UNICODE(@nstring))
Tipos de data e hora
No SQL Server 2008, aumentou muito os tipos de dados para armazenar datas e horas.
Exemplo:
USE AdventureWorks
GO
CREATE TABLE test.DATAHORA
(
CAMPO1 SMALLDATETIME,
CAMPO2 DATETIME,
CAMPO3 DATETIME2,
CAMPO4 DATETIMEOFFSET,
CAMPO5 DATE,
CAMPO6 TIME
)
GO
-- INSERINDO SOMENTE UMA DATA EM UM CAMPO SMALLDATETIME
INSERT INTO test.DATAHORA(CAMPO1) VALUES ('01/11/2012')
GO
-- INSERINDO DATA E HORA EM UM CAMPO SMALLDATETIME (NAO GUARDA OS SEGUNDOS)
6. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 6 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
INSERT INTO test.DATAHORA(CAMPO1) VALUES ('01/11/2012 01:15:06.000')
GO
-- INSERINDO SOMENETE UMA DATA EM UM CAMPO DATETIME
INSERT INTO test.DATAHORA(CAMPO2) VALUES ('01/11/2012')
GO
-- INSERINDO DATA E HORA EM UM CAMPO DATETIME
INSERT INTO test.DATAHORA(CAMPO2) VALUES ('01/11/2012 01:15:06.125')
GO
-- INSERINDO SOMENTE UMA DATA EM UM CAMPO DATETIME2
INSERT INTO test.DATAHORA(CAMPO3) VALUES ('01/11/2012')
GO
-- INSERINDO DATA E HORA EM UM CAMPO DATETIME
INSERT INTO test.DATAHORA(CAMPO3) VALUES ('01/11/2012 01:15:06.125')
GO
-- INSERINDO DATA E HORA e FUSO EM UM CAMPO DATETIMEOFFSET
INSERT INTO test.DATAHORA(CAMPO4) VALUES ('01/11/2012 14:15:06.158 +3:30')
GO
INSERT INTO test.DATAHORA(CAMPO4) VALUES ('01/11/2012 20:30:02.141 -5:00')
GO
-- INSERINDO DATA EM UM CAMPO DO TIPO DATE
INSERT INTO test.DATAHORA(CAMPO5) VALUES ('04/15/2012')
GO
-- INSERINDO HORA EM UM CAMPO DO TIPO TIME
INSERT INTO test.DATAHORA(CAMPO6) VALUES ('06:59:09.961')
GO
-- VERIFICANDO RESULTADOS DA TABELA
SELECT * FROM test.DATAHORA
GO
-- Mais informações: http://msdn.microsoft.com/pt-br/library/bb630289.aspx
DATETIME E SMALLDATETIME armazenam data e hora em um único campo e existe em várias
edições anteriores do SQL Server. DATETIME2 oferece precisão melhor que DATETIME e
SMALLDATETIME. DATETIMEOFFSET permite armazenar um fuso horário para aplicativos que
precisam regionalizar data e horas.
Dados binários
São armazenados em um conjunto em quatro tipos de dados:
De modo analógico aos tipos de dados alfanuméricos de comprimento variável, você pode aplicar a
palavra-chave MAX no tipo de dados VARBINARY para permitir o armazenamento de até 2 GB de
dados, enquanto suporta todas as funções de programação disponíveis para manipular dados binários;
7. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 7 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
Tipo de dados XML
O tipo de dados XML permite armazenar e manipular documentos XML (Extensible Markup
Language) de forma nativa. Ao armazenar documentos XML, você está limitando a um máximo de 2
GB, assim como a um máximo de 128 níveis dentro de um documento. Embora você possa armazenar
um documento XML em uma coluna alfanumérica, o tipo XML entende de forma nativa a estrutura de
dados XML e o significado das marcas XML dentro do documento. Voce pode aplicar validação
adicional na coluna XML, que restringe os documentos que podem ser armazenados com base em um
ou mais esquemas XML.
Os esquemas XML são armazenados dentro do SQL Server em uma estrutura chamada coleção de
esquemas (schema collection). As coleções podem conter um ou mais esquemas XML. Quando uma
coleção de esquemas é aplicada em uma coluna XML, os únicos documentos que podem ser
armazenados dentro da coluna XML devem primeiramente ser validados na coleção de esquemas XML
associada.
O comando a seguir cria uma coleção de esquemas XML:
8. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 8 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
Além desses, o SQL Server 2008 possui os tipos de dados espaciais e tipos de dados HIERARCHID,
porém não serão vistos nesse momento;
Propriedades de coluna
Anulação
Indica se uma coluna permite ou não valores nulos. Caso não esteja explicito no comando de criação da
tabela em cada coluna, o SQL Server tem o padrão NULL (pode conter valores nulos). É aconselhável
que se especifique na criação dos objetos, pois a propriedade do banco ANSI_NULL_DEFAULT pode
ser modificada;
Exemplo:
USE master
GO
-- The code from this point on demonstrates that SET ANSI_NULL_DFLT_ON
-- has an effect when the 'ANSI null default' for the database is
false.
-- Set the 'ANSI null default' database option to false by executing
-- ALTER DATABASE.
9. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 9 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
ALTER DATABASE AdventureWorks SET ANSI_NULL_DEFAULT OFF;
GO
USE AdventureWorks;
GO
-- Create table t1.
CREATE TABLE t1 (a TINYINT) ;
GO
-- NULL INSERT should fail.
INSERT INTO t1 (a) VALUES (NULL);
GO
-- SET ANSI_NULL_DFLT_ON to ON and create table t2.
SET ANSI_NULL_DFLT_ON ON;
GO
CREATE TABLE t2 (a TINYINT);
GO
-- NULL insert should succeed.
INSERT INTO t2 (a) VALUES (NULL);
GO
-- SET ANSI_NULL_DFLT_ON to OFF and create table t3.
SET ANSI_NULL_DFLT_ON OFF;
GO
CREATE TABLE t3 (a TINYINT);
GO
-- NULL insert should fail.
INSERT INTO t3 (a) VALUES (NULL);
GO
Mais informações em: http://msdn.microsoft.com/pt-br/library/ms187375.aspx
COLLATE
Podemos especificar a propriedade COLLATE de um banco de dados para anular a sequencia de
collation da instância, a qual o SQL Server aplica então como sequencia padrão para os objetos dentro
do banco de dados. Assim também é possível anular a sequencia do banco para sobrepor a sequencia da
tabela inteira ou para uma coluna individual.
Especificando a opção COLLATE para uma coluna alfanumérica, você pode configurar um
comportamento específico para o idioma na coluna.
Exemplo:
CREATE TABLE test.COLECAO
(
CAMPO1 VARCHAR(30),
CAMPO2 VARCHAR(30) COLLATE Traditional_Spanish_ci_ai
)
GO
INSERT INTO test.COLECAO (CAMPO1, CAMPO2) VALUES ('Chiapas','Chiapas');
10. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 10 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
INSERT INTO test.COLECAO (CAMPO1, CAMPO2) VALUES ('Colima','Colima');
INSERT INTO test.COLECAO (CAMPO1, CAMPO2) VALUES ('Cinco Rios','Cinco Rios');
INSERT INTO test.COLECAO (CAMPO1, CAMPO2) VALUES ('California','California');
SELECT * FROM test.COLECAO
order by CAMPO1 asc
GO
SELECT * FROM test.COLECAO
order by CAMPO2 asc
GO
--Apply an typical collation
SELECT CAMPO1, CAMPO2 FROM test.COLECAO
ORDER BY CAMPO2
COLLATE Latin1_General_CS_AS_KS_WS ASC;
GO
-- Apply a Spanish collation
SELECT CAMPO1, CAMPO2 FROM test.COLECAO
ORDER BY CAMPO2
COLLATE Traditional_Spanish_ci_ai ASC;
GO
Mais informações em: http://msdn.microsoft.com/pt-br/library/ms190273.aspx
IDENTITY
São utilizadas em colunas do tipo inteiro (exceto float e real), para fornecer um valor automático
sequencial. Não se pode atualizar uma coluna do tipo identidade. Em uma tabela, só pode ter uma
coluna de identidade. É necessário também especificar um valor de propagação e um valor de
incremento a ser aplicado para cada linha inserida subsequentemente. Geralmente colunas de
identidade são únicas, mas não é item obrigatório. Embora o SQL Server forneça o próximo valor da
sequencia automaticamente, você pode inserir um valor em uma coluna de identidade explicitamente,
usando o comando SET IDENTITY_INSERT <nome da tabela> ON. Você também pode mudar o
próximo valor gerado modificando a propagação com o comando DBCC CHECKIDENT.
Exemplo
CREATE TABLE test.IDENTIDADE
(
CAMPO1 INT NOT NULL IDENTITY(1,1) primary key,
CAMPO2 VARCHAR(20)
)
GO
--Tentativa de insercao de um dado passando valor para a coluna IDENTITY
INSERT INTO test.IDENTIDADE (CAMPO1, CAMPO2) VALUES (1,'TESTE');
GO
--Inserindo um dado na tabela que contem identity
INSERT INTO test.IDENTIDADE (CAMPO2) VALUES ('TESTE');
GO
INSERT INTO test.IDENTIDADE (CAMPO2) VALUES ('TESTE2');
GO
INSERT INTO test.IDENTIDADE (CAMPO2) VALUES ('TESTE3');
GO
INSERT INTO test.IDENTIDADE (CAMPO2) VALUES ('TESTE4');
GO
--VERIFICANDO OS DADOS
SELECT * FROM test.IDENTIDADE
GO
--INSERINDO UM DADO EXPLICITAMENTE NA COLUNA IDENTITY
11. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 11 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
SET IDENTITY_INSERT test.IDENTIDADE ON
GO
--insercao de um dado passando valor para a coluna IDENTITY
INSERT INTO test.IDENTIDADE (CAMPO1, CAMPO2) VALUES (6,'TESTE6');
GO
--DESABILITANDO A INSERCAO MANUAL
SET IDENTITY_INSERT test.IDENTIDADE OFF
GO
--tentativa de insercao de um dado passando valor para a coluna IDENTITY
INSERT INTO test.IDENTIDADE (CAMPO1, CAMPO2) VALUES (7,'TESTE7');
GO
--Inserindo um dado na tabela que contem identity
INSERT INTO test.IDENTIDADE (CAMPO2) VALUES ('TESTE_A');
GO
INSERT INTO test.IDENTIDADE (CAMPO2) VALUES ('TESTE_B');
GO
INSERT INTO test.IDENTIDADE (CAMPO2) VALUES ('TESTE_C');
GO
INSERT INTO test.IDENTIDADE (CAMPO2) VALUES ('TESTE_D');
GO
--VERIFICANDO OS DADOS
SELECT * FROM test.IDENTIDADE
GO
--MUDANDO O PROXIMO VALOR PROPAGADO
DBCC CHECKIDENT ("test.IDENTIDADE", RESEED,20)
--inserindo dados
INSERT INTO test.IDENTIDADE (CAMPO2) VALUES ('TESTE_D');
GO
--VERIFICANDO OS DADOS
SELECT * FROM test.IDENTIDADE
GO
ROWGUIDCOL
Propriedade usada principalmente pela replicação por mesclagem (merge), para designar uma coluna
para identificar linhas exclusivamente nos banco de dados. É usada para garantir que exista apenas uma
coluna desse tipo e que ela tenha o tipo de dados UNIQUEIDENTIFIER;
Exemplo
-- CRIANDO TABELA COM A COLUNA DE IDENTIFICACAO UNICA
CREATE TABLE test.TABELA_COM_GUID
(
CODIGO uniqueidentifier ROWGUIDCOL,
NOME varchar(20)
)
GO
-- INSERINDO DADOS
INSERT INTO test.TABELA_COM_GUID (CODIGO,NOME) VALUES
(NEWID(),'TESTE1');
GO
INSERT INTO test.TABELA_COM_GUID (CODIGO,NOME) VALUES
(NEWID(),'TESTE2');
12. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 12 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
GO
INSERT INTO test.TABELA_COM_GUID (CODIGO,NOME) VALUES
(NEWID(),'TESTE3');
GO
INSERT INTO test.TABELA_COM_GUID (CODIGO,NOME) VALUES
(NEWID(),'TESTE4');
GO
-- VERIFICANDO DADOS
SELECT * FROM test.TABELA_COM_GUID
GO
Ao contrário do Identity, o GUID não gera um sequencial. Para que isso aconteça, na criação da tabela
é necessário utilizar o seguinte comando:
CREATE TABLE test.Globally_Unique_Data
(
guid uniqueidentifier CONSTRAINT Guid_Default DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Employee_Name varchar(60)
CONSTRAINT Guid_PK PRIMARY KEY (guid)
)
go
-- INSERINDO DADOS
insert into test.Globally_Unique_Data (Employee_Name) values ('teste1');
GO
insert into test.Globally_Unique_Data (Employee_Name) values ('teste2');
GO
insert into test.Globally_Unique_Data (Employee_Name) values ('teste3');
GO
insert into test.Globally_Unique_Data (Employee_Name) values ('teste4');
GO
insert into test.Globally_Unique_Data (Employee_Name) values ('teste5');
GO
insert into test.Globally_Unique_Data (Employee_Name) values ('teste6');
GO
-- SELECIONANDO DADOS
SELECT * FROM test.Globally_Unique_Data
GO
Mais informações em: http://msdn.microsoft.com/pt-br/library/ms191131.aspx
FILESTREAM
Esse tipo de propriedade é aplicado a uma coluna do tipo VARBINARY(MAX), que os objetos são
referenciados a uma pasta do SO. Como o SQL Server controla essa pasta, quando é feito backup do
banco de dados, os arquivos dessa pasta também são feitos ao mesmo tempo.
Observação: Um filegroup designado para armazenamento de um FILESTREAM fica off-line e
inacessível dentro de um Database Snapshot. Além disso, você não pode implementar Database
Mirroring em um banco de dados contendo dados armazenamentos com FILESTREAM.
13. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 13 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
NOT FOR REPLICATION
É usada para uma coluna definida como IDENTITY. Caso você insira explicitamente um valor de uma
coluna IDENTITY, o SQL Server gera uma nova propagação automaticamente para a coluna. Se a
tabela estiver participando de replicação, você não vai querer gerar uma nova propagação para essa
coluna sempre que os dados forem sincronizados. Aplicando a propriedade NOT FOR REPLICATION
para a coluna de identidade quando o mecanismo de replicação estiver aplicando alterações;
Mais informações em:
http://msdn.microsoft.com/pt-br/library/ms186775.aspx
http://msdn.microsoft.com/pt-br/library/ms188997.aspx
http://msdn.microsoft.com/en-us/library/aa237102(v=sql.80).aspx
SPARSE
Projetada para otimizar o espaço de armazenamento de colunas com uma grande porcentagem de
valores NULL. Para ser aplicada, a coluna deve aceitar NULL. Quando um valor NULL é armazenado
em uma coluna designada SPARCE, nenhum espaço de armazenamento é consumido. Contudo, os
valores não NULL exigem 4 bytes de espaço de armazenamento atém do espaço normal consumido
pelo tipo de dados.
Você não pode aplicar a propriedade SPARCE em:
- Colunas com a propriedade ROWGUIDCOL ou IDENTITY;
- Tipos de dados TEXT, NTEXT, IMAGE, TIMESTAMP, GEOMETRY, GEOGRAPHY ou tipos
definidos pelo usuário;
- Um VARBINARY(MAX) com a propriedade FILESTREAM;
- Uma coluna calculada de uma coluna com uma regra padrão vinculado a ela;
- Colunas que fazem parte de um índice clusterizado ou de uma chave primária;
- Uma coluna dentro de uma instrução ALTER TABLE;
-- coluna sparsas
USE AdventureWorks
GO
--CREATE SCHEMA test AUTHORIZATION dbo
--GO
CREATE TABLE test.DocumentStore (
DocID int PRIMARY KEY,
Title varchar(200) NOT NULL,
ProductionSpecification varchar(20) SPARSE NULL,
ProductionLocation smallint SPARSE NULL,
MarketingSurveyGroup varchar(20) SPARSE NULL
)
14. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 14 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
GO
--inserindo dados na tabela
INSERT test.DocumentStore(DocID, Title, ProductionSpecification,
ProductionLocation)
VALUES (1, 'Tire Spec 1', 'AXZZ217', 27);
GO
INSERT test.DocumentStore(DocID, Title, MarketingSurveyGroup)
VALUES (2, 'Survey 2142', 'Men 25 - 35');
GO
-- selecionando todas as colunas
SELECT DocID, Title, ProductionSpecification, ProductionLocation,
MarketingSurveyGroup
FROM test.DocumentStore ;
--especificando a seleção
SELECT DocID, Title, ProductionSpecification, ProductionLocation
FROM test.DocumentStore
WHERE ProductionSpecification IS NOT NULL ;
Referencia: http://msdn.microsoft.com/pt-br/library/cc280604.aspx
Colunas Calculadas
Permitem adicionar em uma tabela colunas quem em vez de serem preenchidas com dados, são
calculadas com base em outras colunas da linha. Quando essa coluna é criada, somente a definição do
cálculo é armazenada. Quando for utilizada um comando DML (insert, update, delete), o valor será
calculado no momento da execução. Se a coluna calculada é PERSISTED, o SQL Server armazena o
resultado do cálculo na linha e atualiza o valor sempre que os dados dos quais os cálculos depende são
alterados.
-- criacao de campos calculados
use AdventureWorks
go
CREATE SCHEMA test AUTHORIZATION dbo
GO
create table test.CAMPOSCALCULADOS (
ID INT NOT NULL IDENTITY(1,1),
ITEM INT NOT NULL,
QUANTIDADE INT,
VALOR MONEY,
DESCONTO MONEY,
IMPOSTO MONEY,
FRETE MONEY,
TOTALGERAL AS (QUANTIDADE * VALOR) - DESCONTO + IMPOSTO + FRETE,
CONSTRAINT PK_CAMPOSCALCULADOS PRIMARY KEY(ID)
)
15. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 15 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
GO
INSERT INTO test.CAMPOSCALCULADOS (ITEM, QUANTIDADE, VALOR, DESCONTO, IMPOSTO,
FRETE)
VALUES (1,10,1.25,2,5,2),
(2,20,4.10,1,15,5),
(3,40,3.55,10,20,10)
GO
SELECT * FROM test.CAMPOSCALCULADOS
GO
Compactação de linha e página
A compactação em nível de linha permite compactar linhas individuais para encaixar mais linhas em
uma página, o que por sua vez reduz a quantidade de espaço de armazenamento para a tabela, pois não
é preciso armazenar tantas páginas em um disco. (O limite de compactação é de no máximo 8.060
bytes em uma única linha)
A compactação de página reduz somente a quantidade de armazenamento em disco necessária, pois a
página inteira é compactada. Quando o SQL Server aplica compactação de página em um heap (uma
tabela sem índice clusterizado), ele compacta apenas as páginas que existem atualmente na tabela. O
SQL Server compactará dados novos adicionados em um heap somente se você usar as instruções
BULK INSERT ou INSERT INTO...WITH (TABLLOCK). As páginas adicionadas na tabela usando
BCP ou uma instrução INSERT que não especifique uma sugestão de bloqueio de tabela não são
compactadas. Para compactar páginas recentemente adicionadas e não compactadas você precisa
executar o comando ALTER TABLE...REBUILD com a opção de compactação PAGE.
A configuração de compactação para uma tabela não passa para índices não-clusterizados ou views
indexadas criadas na tabela. (É necessário especificar para cada uma delas);
Os tipos VARCHAR(MAX), NVARCHAR(MAX) e VARBINARY(MAX) (incluindo também com a
opção FILESTREAM) armazenam dados em estruturas especializadas fora da linha, que não podem ser
compactados;
No SQL Server 2008, uma tabela pode ter 1.024 colunas, porém utilizando os recursos de colunas
esparsas, você pode criar uma tabela com até 30.000 colunas. As tabelas que excedem as 1.024
colunas usando uma definição de configuração de coluna são referidas como tabelas amplas, mas os
dados armazenados não podem ainda passar de 8.019 bytes, a não ser que você tenha as colunas do tipo
VARCHAR(MAX), NVARCHAR(MAX) ou VARBINARY(MAX) definida na tabela;
Além de tabelas persistentes em disco, temos também tabelas temporárias que são armazenadas no
banco de dados tempdb, podendo ser locais ou globais. Uma tabela temporária local é criada da mesma
forma que uma tabela comum, porém com o símbolo # antes do nome da tabela (somente visível dentro
da conexão que a criou) e uma global tem o símbolo ## antes do nome da tabela (visível a todas as
conexões da instancia);
16. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 16 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
Criando tabelas
No código abaixo, segue criação de um schema e duas tabelas, conforme exemplos vistos:
USE AdventureWorks
GO
CREATE SCHEMA test AUTHORIZATION dbo
GO
CREATE TABLE test.Customer
(
CustomerID INT IDENTITY(1,1),
LastName VARCHAR(50) NOT NULL,
FirstName VARCHAR(50) NOT NULL,
CreditLine MONEY SPARSE NULL,
CreationDate DATE NOT NULL
)
GO
CREATE TABLE test.OrderHeader
(
OrderID INT IDENTITY(1,1),
CustomerID INT NOT NULL,
OrderDate DATE NOT NULL,
OrderTime TIME NOT NULL,
SubTotal MONEY NOT NULL,
ShippingAmt MONEY NOT NULL,
OrderTotal AS (SubTotal + ShippingAmt)
)
WITH (DATA_COMPRESSION = ROW)
GO
Exemplos de criação de tabelas com colunas SPARSE, colunas calculadas e
compressão em linha
17. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 17 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
Lição 2 – Implementando constraints
As constraints são utilizadas para impor regras de negócios e consistência de dados;
Primary Keys (Chaves Primárias)
Chaves primárias definem a coluna ou colunas que identificam exclusivamente cada linha da tabela,
sendo que as mesmas precisam ser NOT NULL. Só pode haver uma constraint de chave primária por
tabela; Quando a chave primária é criada, você também especifica se ela é CLUSTERED ou
NONCLUSTERED (agrupada ou não-agrupada). Uma chave CLUSTERED, o SQL SERVER
armazena a tabela em ordem de classificação de acordo com a chave primária;
Dica: A opção padrão de uma chave primária é CLUSTERED. Quando uma chave primária
CLUSTERED é criada em uma tabela que é compactada, a opção de compactação é aplicada na chave
primária quando a tabela é reconstruída;
-- criacao de chaves primarias
use AdventureWorks
go
CREATE SCHEMA test AUTHORIZATION dbo
GO
--exemplo1, sem nomeação da chave primária, em nivel coluna
CREATE TABLE test.Funcionarios
(
ID int NOT NULL PRIMARY KEY,
Nome varchar(30),
Nascimento date,
Salario money
)
go
--exemplo2, com nomeação da chave primário, em nivel tabela
--e utilizando um identity de 1 em 1 para auto-incremento
CREATE TABLE test.Clientes
(
ID bigint NOT NULL identity(1,1),
Tipo_Pessoa char(1),
Nome_Razao varchar(40),
Cidade varchar(20),
UF char(02),
Constraint pk_Clientes PRIMARY KEY(ID)
)
GO
18. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 18 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
--exemplo3, com nomeacao da PK, e com mais de 1 campo sendo a PK
CREATE TABLE test.ItemNF
(
Nr_NF int not null,
Item_NF smallint not null,
Cod_Prod int,
Quantidade int,
Valor_unit money,
Constraint pk_ItemNF Primary Key (NR_NF, Item_NF)
)
Go
--exemplo4: alterando uma tabela já existente e adicionando uma chave primária
--criando a tabela sem PK
create table test.ALUNO
(
RA CHAR(7),
Nome varchar(40),
Cod_Curso int
)
go
--alterando o RA para not null
alter table test.ALUNO alter column RA CHAR(07) NOT NULL
GO
--alterando para ser PK
alter table test.ALUNO add constraint PK_Aluno PRIMARY KEY(RA)
GO
Referência: http://msdn.microsoft.com/pt-br/library/ms190273.aspx
Foreign Keys (Chaves Estrangeiras)
São utilizadas para integridade referencial entre tabelas dentro do banco de dados. Criando chaves
estrangeiras, você pode garantir que tabelas relacionadas não contenham linhas órfãs inválidas. As
chaves estrangeiras criam a relação pai-filho entre duas tabelas e garantem que um valor que não exista
na tabela pai não possa ser gravado na tabela filho;
Para criar uma chave estrangeira entre duas tabelas, a tabela pai deve ter uma chave primária, a qual é
usada para se referir à tabela filho e os tipos de dados entre as colunas das devidas tabelas devem ser
compatíveis. Se você tiver uma chave primária de várias colunas, todas as colunas da chave primária
pai devem existir na tabela filho para definir uma chave estrangeira;
--criacao de foreign key's
--exmeplo1: criando PK e FK na criacao da tabela, com nomeacao
--criacao da tabela PAI
19. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 19 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
CREATE TABLE test.Pedidos
(
Cod_Pedido int not null,
Data_Pedido date,
Cod_Cli int,
Constraint pk_Pedidos Primary key(Cod_Pedido)
)
go
--Criacao da tabela filho, relacionando a FK
CREATE TABLE test.ItensPedido
(
Cod_Pedido int not null,
Item_Pedido int not null,
Cod_Prod int,
Quantidade int,
Valor money,
Constraint pk_ItensPedido Primary Key(Cod_Pedido,Item_Pedido),
Constraint fk_ItensPedido_Cod_Pedido Foreign Key(Cod_Pedido)
references test.Pedidos(Cod_Pedido)
)
go
--exmeplo2: Criando uma FK sem nomeacao
--excluindo tabelas
DROP TABLE test.ItensPedido
GO
DROP TABLE test.Pedidos
GO
--criacao da tabela PAI
CREATE TABLE test.Pedidos
(
Cod_Pedido int not null,
Data_Pedido date,
Cod_Cli int,
Constraint pk_Pedidos Primary key(Cod_Pedido)
)
go
--Criacao da tabela filho, relacionando a FK, sem nomeacao
CREATE TABLE test.ItensPedido
(
Cod_Pedido int not null,
Item_Pedido int not null Foreign Key(Cod_Pedido)
references test.Pedidos(Cod_Pedido),
Cod_Prod int,
Quantidade int,
Valor money,
Constraint pk_ItensPedido Primary Key(Cod_Pedido,Item_Pedido),
)
go
20. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 20 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
--exmeplo3: Criando uma FK depois da tabela estar pronta
--excluindo tabelas
DROP TABLE test.ItensPedido
GO
DROP TABLE test.Pedidos
GO
--criacao da tabela PAI
CREATE TABLE test.Pedidos
(
Cod_Pedido int not null,
Data_Pedido date,
Cod_Cli int,
Constraint pk_Pedidos Primary key(Cod_Pedido)
)
go
--Criacao da tabela filho sem relacao com a FK
CREATE TABLE test.ItensPedido
(
Cod_Pedido int not null,
Item_Pedido int not null,
Cod_Prod int,
Quantidade int,
Valor money,
Constraint pk_ItensPedido Primary Key(Cod_Pedido,Item_Pedido),
)
go
--criando a relação pai/filh
alter table test.ItensPedido add Foreign Key(Cod_Pedido)
references test.Pedidos(Cod_Pedido)
go
Unique Constraint (Constraint exclusivas)
Permitem definir uma coluna ou colunas que os valores devem ser exclusivos dentro da tabela. Por
exemplo, um CPF ou CNPJ dentro da tabela de clientes ou de fornecedores não poderiam se repetir. O
que diferencia essa constraint de uma chave primária, é que a constraint UNIQUE permite ter um valor
NULL na tabela;
--criacao de campos UNIQUE
--criando a tabela, com constraint UNIQUE sem nomeacao
create table test.empresas
(
Cod_Empresa int not null,
CNPJ char(18) unique,
Razao_Social varchar(30)
)
go
21. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 21 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
--criando tabela, com nomeacao da constraint UNIQUE
drop table test.empresas
go
create table test.empresas
(
Cod_Empresa int not null,
CNPJ char(18),
Razao_Social varchar(30),
constraint UK_Empresas_CNPJ UNIQUE (CNPJ)
)
go
--insercao de dados para teste
insert into test.empresas values(1,'00.000.000/0001-00','empresa 1')
go
--irá charmar o erro:
insert into test.empresas values(2,'00.000.000/0001-00','empresa 1')
go
Default Constraint (Constraint padrão)
Especifica um valor padrão que é gravado na coluna caso o aplicativo não fornece nenhum valor. As
constraints default se aplicam apenas as colunas adicionadas com uma instrução INSERT, BPC ou
BULK INSERT. Pode ser definidas em colunas NULL ou NOT NULL. Caso seja explicito a passagem
do valor NULL, o valor NULL terá prioridade sobre o valor padrão.
-- exemplo de DEFAULT
-- Criando a tabela com nomeacao da constraint DEFAULT
CREATE TABLE test.Cidades
(
Cod_Cidade int not null,
Desc_Cidade varchar(30),
UF char(02) constraint def_UF default 'SP'
)
go
-- teste de insercao de dados
insert into test.Cidades (Cod_Cidade,Desc_Cidade,UF)
values (1,'Balneario Camboriu','SC')
go
insert into test.Cidades (Cod_Cidade,Desc_Cidade)
values (2,'Jundiai')
go
--selecionando os dados
select *
from test.Cidades
Referencia:
http://blog.sqlauthority.com/2008/09/08/sql-server-%E2%80%93-2008-creating-
primary-key-foreign-key-and-default-constraint/
22. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 22 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
Check Constraint (Constraints de verificação)
Limitam o intervalo de valores dentro de uma coluna. As constraints checks podem ser criadas em
nível de coluna e não podem referenciar nenhuma outra coluna na tabela. Quando criadas em nível de
tabela podem referenciar qualquer coluna dentro da tabela, mas não podem referencias colunas de
outras tabelas; O retorno de validação é verdadeiro ou falso; As constraints check podem utilizar
comparações simples como: >, <, >=, <=, <> e =, ou mais complexas como AND, OR ou NOT. Podem
utilizar caracteres curinga % e _, e executar rotinas de correspondências de padrão (mascaras como
CPF, CNPJ, FONE, etc)
-- check constraint
create table test.Estoque
(
ID int not null,
Data_Mov date constraint DF_DATA_MOV default getdate(),
Tipo_Mov char(01) constraint CK_TIPO_MOV check(Tipo_Mov='E' or Tipo_Mov='S'),
Estoque_Min int constraint CK_ESTOQUE_MIN check(Estoque_Min > 0),
Estoque_Max int,
Cod_prod int,
Valor_Prod money constraint CK_VALOR_PROD check(Valor_Prod > 0 and Valor_Prod <
10000),
constraint CK_ESTOQUE_MAX check(Estoque_Max <= Estoque_Min + 50),
)
go
--simulando entradas na tabela estoque
--erro no tipo_mov
insert into test.Estoque (ID,Tipo_Mov, Estoque_Min, Cod_prod, Valor_Prod)
values (1,'A',10,1,100)
go
--consertando o erro tipo_mov
insert into test.Estoque (ID,Tipo_Mov, Estoque_Min, Cod_prod, Valor_Prod)
values (1,'E',10,1,100)
go
insert into test.Estoque (ID,Tipo_Mov, Estoque_Min, Cod_prod, Valor_Prod)
values (2,'S',20,2,100)
go
-- erro no estoque minimo
insert into test.Estoque (ID,Tipo_Mov, Estoque_Min, Cod_prod, Valor_Prod)
values (3,'E',0,10,1000)
go
--consertando o erro do estoque minimo
insert into test.Estoque (ID,Tipo_Mov, Estoque_Min, Cod_prod, Valor_Prod)
values (3,'E',1,10,1000)
go
23. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 23 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
--erro no valor do produto
insert into test.Estoque (ID,Tipo_Mov, Estoque_Min, Cod_prod, Valor_Prod)
values (4,'E',20,100,0)
go
insert into test.Estoque (ID,Tipo_Mov, Estoque_Min, Cod_prod, Valor_Prod)
values (4,'E',20,100,10000)
go
--consertando o erro do valor do produto
insert into test.Estoque (ID,Tipo_Mov, Estoque_Min, Cod_prod, Valor_Prod)
values (4,'E',20,100,999)
go
--erro no valor do ESTOQUE MAXIMO
select * from test.Estoque
insert into test.Estoque (ID,Tipo_Mov, Estoque_Min, Estoque_Max, Cod_prod,
Valor_Prod)
values (5,'E',10,100,100,10)
go
--consertando o valor do estoque maximo
insert into test.Estoque (ID,Tipo_Mov, Estoque_Min, Estoque_Max, Cod_prod,
Valor_Prod)
values (5,'E',10,10,50,10)
go
Mais informações sobre criação de tabelas: http://msdn.microsoft.com/pt-br/library/ms174979.aspx
Projetando um banco de dados: http://msdn.microsoft.com/pt-br/library/ms189317.aspx
24. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: CRIACAO DE TABELAS
Rev. 3
13.11.2019
Pág. 24 de 24
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO – rodrigok@anchieta.br
Exercícios:
Cenário:
A Empresa FRUTAS DA HORTA NA HORA Ltda resolveu implantar um sistema de pedidos on-line
para seus clientes jurídicos da região que estejam localizados até 200 KM de raio da sua sede. O DBA
atual, KAVITA GURU disse que não irá conseguir desenvolver esse serviço, por conta das
manutenções, já existem nos sistemas atuais e para isso, contratou você para desenvolver e criar a base
de dados do novo sistema baseado no cenário abaixo:
A empresa precisará de uma tabela de CLIENTES contendo código de identificação (auto-numeração),
login (único), senha (no mínimo de 6 caracteres), razão social (obrigatório), cnpj (único sem repetição),
endereço, bairro, cidade (a maioria da cidade de São Paulo sendo o padrão), uf (a maioria do estado de
SP, sendo o padrão), cep, telefones de contato, email’s de contato. Além disso, precisará cadastrar seus
PRODUTOS (frutas), com os dados de código de identificação, descrição do produto (obrigatório),
estoque mínimo (sempre maior do que 10), estoque máximo (nunca menor que estoque mínimo e
nunca maior que estoque mínimo + 100), valor de custo (maior ou igual a 1), valor de venda (valor de
custo + 25%), unidade de medida de venda (podendo ser KG, DUZIA, CAIXA, etc), grupo que o
produto pertence (consultando a tabela de grupos contendo código de identificação e descrição do
grupo).
Para que o sistema funcione, também será necessário as tabelas de PEDIDOS e ITENS_DO_PEDIDO
contendo, código de identificação do pedido (auto-numeração), status do pedido (podendo ter o valor
de “A” ativo ou “C” Cancelado e por padrão ser “A” ativo) , data do pedido (precisa ser a mesma da
data do sistema), cliente que solicitou, identificação dos produtos pedidos , valor de venda dos
produtos pedidos, quantidade dos produtos, unidades dos produtos para venda, sub-totais de cada
produto pedido (quantidade x valor do produto), valor total do pedido. A quantidade de produtos
pedidos deverá ser maior que 1(para cada produto) e o valor dos produtos deverá ser consultado da
tabela de produtos do valor de venda.
A FRUTAS DA HORTA NA HORA Ltda comprou o SQL Server 2008 Enterprise e novos hardwares
para suportar o novo sistema, sem limites de usuários para que você desenvolva esse trabalho.
No cenário acima, será necessário:
- Normalizar as tabelas até a 3FN;
- Se necessário, crie outros campos para melhor definir as tabelas;
- Criar o banco de dados da empresa, já tendo em mente que a tabela de PEDIDOS e ITENS DO
PEDIDO serão as mais críticas em relação a armazenamento de dados;
- Criar as tabelas, com seus devidos tipos de dados, relacionamentos e constraints (envolvendo os
checks, defaults, etc);
- Verificar se há regras de negócio que o banco de dados não consegue suprir;