2. Seção 4: Integridade de Dados
• Aula 1: Integridade de dados;
• Aula 2: Constraints;
• Aula 3: Triggers;
• Lab: Integridade de dados com constraints e triggers;
SQL Server - Módulo I 2
3. Aula 1: Integridade de dados
• Tipos de integridade de dados;
• Opções para garantir a integridade de dados;
SQL Server - Módulo I 3
4. Tipos de integridade de dados
• Integridade de domínio: define o tipo de informação válida para uma
coluna. Exemplo: tipo de dados, valores nulos, intervalos aceitos etc;
• Integridade de entidade: define o identificador único de uma tabela.
Exemplo: chave primária e índice único;
• Integridade referencial: define o relacionamento (link) entre tabelas
ou entre uma tabela e ela mesma. Exemplo: chave estrangeira;
SQL Server - Módulo I 4
5. Opções para integridade de dados
• Tipos de dados: definem o tipo de informação aceita em uma coluna;
• Rule: regras para determinar valores aceitos por uma coluna;
• Default: valor padrão de uma coluna quando seu valor for omitido;
• Constraints: mecanismo da Engine para integridade de dados;
• Triggers: tipo especial de procedure executada automaticamente ao
realizar modificações em uma tabela ou view;
SQL Server - Módulo I 5
6. Aula 2: Constraints
• Constraints;
• Key Constraints;
• Outras constraints;
• Integridade referencial em cascata;
• Observações sobre checagem de constraints;
SQL Server - Módulo I 6
7. Constraints
• DEFAULT: valor padrão de uma coluna, quando o mesmo for omitido;
• CHECK: verifica os valores aceitos pela coluna;
• FOREIGN KEY: chave estrangeira que define os valores das colunas que devem
existir na chave primária da tabela referenciada;
• PRIMARY KEY: chave primária que identifica uma linha como única em uma
tabela;
• UNIQUE: previne duplicidades de linhas em uma tabela;
SQL Server - Módulo I 7
8. Primary Key Constraints
• Identifica unicamente uma linha na tabela;
• Apenas uma por tabela;
• Pode ser composta por múltiplas colunas;
• Não aceita valores nulos;
SQL Server - Módulo I 8
ALTER TABLE [Person].[BusinessEntity]
ADD CONSTRAINT [PK_BusinessEntity_BusinessEntityID]
PRIMARY KEY CLUSTERED ([BusinessEntityID] ASC);
9. Foreign Key Constraints
• Link entre tabelas;
• Principal componente da integridade referencial;
• Precisa referenciar uma chave primária ou Unique;
• Pode aceitar valores nulos;
SQL Server - Módulo I 9
ALTER TABLE [Person].[Person] WITH CHECK ADD CONSTRAINT [FK_Person_BusinessEntity_BusinessEntityID]
FOREIGN KEY([BusinessEntityID])
REFERENCES [Person].[BusinessEntity] ([BusinessEntityID]);
ALTER TABLE [Person].[Person] CHECK CONSTRAINT [FK_Person_BusinessEntity_BusinessEntityID];
10. DEFAULT Constraints
• DEFAULT: valor padrão quando omitido;
• Apenas um DEFAULT por coluna;
• Aceita a chamada de algumas System Functions;
SQL Server - Módulo I 10
ALTER TABLE [Person].[BusinessEntity] ADD CONSTRAINT [DF_BusinessEntity_ModifiedDate]
DEFAULT (getdate()) FOR [ModifiedDate]
11. CHECK Constraints
• CHECK: controla valores aceitos pela coluna;
• São permitidas múltiplas condições check por coluna;
• É possível referenciar outras colunas da mesma tabela;
SQL Server - Módulo I 11
ALTER TABLE [Person].[Person] WITH CHECK ADD CONSTRAINT [CK_Person_PersonType] CHECK
(([PersonType] IS NULL OR (upper([PersonType])='GC' OR upper([PersonType])='SP' OR
upper([PersonType])='EM' OR upper([PersonType])='IN' OR upper([PersonType])='VC' OR
upper([PersonType])='SC')))
ALTER TABLE [Person].[Person] CHECK CONSTRAINT [CK_Person_PersonType]
GO
12. UNIQUE Constraints
• Assegura que o valor da coluna é único na tabela;
• Somente um valor NULL é aceito por coluna;
• É possível combinar múltiplas colunas em uma constraint UNIQUE;
SQL Server - Módulo I 12
ALTER TABLE [HumanResources].[EmployeeOrg] ADD UNIQUE NONCLUSTERED
(
[EmployeeID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY =
OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,
OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO
13. Integridade referencial em cascata
• NO ACTION (padrão): retorna um erro e realiza o rollback da
transação;
• CASCADE: atualiza ou deleta os valores das foreign keys em todas as
tabelas referenciadas pela primary key em questão;
• SET NULL: define o valor NULL para as foreign keys em todas as
tabelas referenciadas pela primary key em questão;
• SET DEFAULT: define o valor DEFAULT para as foreign keys em todas
as tabelas referenciadas pela primary key em questão;
SQL Server - Módulo I 13
14. Exemplo de integridade referencial
em cascata
SQL Server - Módulo I 14
CREATE TABLE dbo.Produto
( IdProduto INT PRIMARY KEY,
Nome VARCHAR(50) NOT NULL,
Descricao VARCHAR(25)
);
CREATE TABLE dbo.Estoque
( IdEstoque INT PRIMARY KEY,
IdProduto INT NOT NULL,
Quantidade INT,
ValorMinimo INT,
CONSTRAINT FK_Estoque_Produto
FOREIGN KEY (IdProduto)
REFERENCES dbo.Produto (IdProduto)
ON DELETE CASCADE
ON UPDATE CASCADE
);
15. Observações sobre constraints
• Utilize nomes bem descritivos para as constraints;
• Crie, altere ou delete constraints sem ter que deletar a tabela;
• Opte sempre por fazer verificação de erros na aplicação e em
transações;
• Pode-se desabilitar foreign keys para melhorar o desempenho de
INSERTs em lotes grandes;
• Também, é possível desabilitar uma FK em sua criação para evitar a
checagem de dados existentes na tabela;
SQL Server - Módulo I 15
16. Hands-on constraints
SQL Server - Módulo I 16
ALTER TABLE Person.EmailAddress
ADD CONSTRAINT UQ_Person_EmailAddress_PostalCode
UNIQUE NONCLUSTERED ([EmailAddress] ASC);
GO
ALTER TABLE Person.EmailAddress WITH CHECK
ADD CONSTRAINT CK_Person_EmailAddress_PostalCode_Len
CHECK (LEN([EmailAddress]) > 10);
GO
ALTER TABLE Person.EmailAddress DROP CONSTRAINT UQ_Person_EmailAddress_PostalCode;
GO
ALTER TABLE Person.EmailAddress DROP CONSTRAINT CK_Person_EmailAddress_PostalCode_Len;
GO
17. Aula 3: Triggers
• Visão geral sobre triggers;
• Trigger para INSERT;
• Trigger para DELETE;
• Trigger para UPDATE;
• Trigger INSTEAD OF;
• Triggers aninhadas;
• Triggers recursivas;
SQL Server - Módulo I 17
18. Visão geral sobre triggers
• Tipo especial de stored procedure executada automaticamente ao realizar
um INSERT, UPDATE ou DELETE;
• Parte da transação do comando executado;
• AFTER: as triggers do tipo AFTER são executadas após a modificação dos
dados pelo comando de INSERT, UPDATE ou DELETE;
• INSTED OF: as triggers do tipo INSTEAD OF são executadas antes da
modificação dos dados pelo comando de INSERT, UPDATE ou DELETE;
SQL Server - Módulo I 18
19. Triggers AFTER INSERT
• O comando de INSERT é executado;
• Os dados do INSERT são armazenados no log de transações;
• Por fim, a trigger AFTER INSERT é acionada;
• Permite acesso à tabela INSERTED;
SQL Server - Módulo I 19
CREATE TRIGGER [Person].[iuPerson] ON [Person].[Person]
AFTER INSERT NOT FOR REPLICATION AS
BEGIN
UPDATE [Person].[Person]
SET [Person].[Person].[Demographics] = N'<IndividualSurvey
xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/IndividualSurvey">
<TotalPurchaseYTD>0.00</TotalPurchaseYTD>
</IndividualSurvey>'
FROM inserted
WHERE [Person].[Person].[BusinessEntityID] = inserted.[BusinessEntityID]
AND inserted.[Demographics] IS NULL;
…
20. Triggers AFTER DELETE
• O comando de DELETE é executado;
• Os dados do DELETE são armazenados no log de transações;
• Por fim, a trigger AFTER DELETE é acionada;
• Permite acesso à tabela DELETED;
SQL Server - Módulo I 20
CREATE TRIGGER [Sales].[iduSalesOrderDetail] ON [Sales].[SalesOrderDetail]
AFTER DELETE AS
BEGIN
DECLARE @Count int;
SET @Count = @@ROWCOUNT;
IF @Count = 0
RETURN;
...
END;
21. Triggers AFTER UPDATE
• O comando de UPDATE é executado;
• Os dados do UPDATE são armazenados no log de transações;
• Por fim, a trigger AFTER UPDATE é acionada;
• Permite acesso às tabelas INSERTED e DELETED;
SQL Server - Módulo I 21
CREATE TRIGGER [Purchasing].[uPurchaseOrderDetail] ON [Purchasing].[PurchaseOrderDetail]
AFTER UPDATE AS
BEGIN
INSERT INTO [Production].[TransactionHistory]
([ProductID], [ReferenceOrderID], [ReferenceOrderLineID], [TransactionType], [TransactionDate]
,[Quantity] ,[ActualCost])
SELECT inserted.[ProductID], inserted.[PurchaseOrderID], inserted.[PurchaseOrderDetailID],'P'
,GETDATE(),inserted.[OrderQty],inserted.[UnitPrice] FROM inserted
INNER JOIN [Purchasing].[PurchaseOrderDetail]
ON inserted.[PurchaseOrderID] = [Purchasing].[PurchaseOrderDetail].[PurchaseOrderID];
…
22. Triggers INSTEAD OF
• O comando de INSERT, DELETE ou UPDATE é executado;
• Porém, o comando não modifica dados da tabela;
• No lugar do comando, a trigger INSTEAD OF é acionada;
SQL Server - Módulo I 22
CREATE TRIGGER [HumanResources].[dEmployee] ON [HumanResources].[Employee]
INSTEAD OF DELETE NOT FOR REPLICATION AS
BEGIN
BEGIN
RAISERROR
(N'Employees cannot be deleted. They can only be marked as not current.', -- Message
10, -- Severity.
1); -- State.
-- Rollback any active or uncommittable transactions
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION;
...
23. Triggers aninhadas
• Triggers aninhadas ocorrem quando uma trigger dispara outra trigger;
• Esse comportamento acontece porque é possível usar um INSERT, UPDATE
ou DELETE dentro de uma trigger que afete outra tabela e,
consequentemente, pode disparar outra trigger;
• A configuração de triggers aninhadas pode ser desabilitada no banco;
• Uma trigger aninhada não irá disparar duas vezes a mesma transação da
trigger;
• Se um rollback for chamado, todas as operações aninhadas serão
desfeitas;
SQL Server - Módulo I 23
24. Triggers recursivas
• Triggers recursivas são desabilitadas por padrão;
• Podem exceder 32 níveis de recursividade se não forem
implementadas corretamente;
• A ordem das atualizações pode ficar complexa com triggers
recursivas;
• Sempre que possível, substitua a lógica recursiva por uma lógica não
recursiva;
SQL Server - Módulo I 24
ALTER DATABASE AdventureWorks2017 SET RECURSIVE_TRIGGERS ON;
25. Hands-on triggers
SQL Server - Módulo I 25
CREATE TRIGGER dPerson ON [Person].[Person]
INSTEAD OF DELETE NOT FOR REPLICATION AS
BEGIN
DECLARE @Count int;
SET @Count = @@ROWCOUNT;
IF @Count = 0
RETURN;
SET NOCOUNT ON;
BEGIN
RAISERROR
(N'Não é permitido deletar uma pessoa.', -- Message
10, -- Severity.
1); -- State.
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION;
END
END;
END;
26. Lab: integridade de dados
• Exercício 1: criando constraints;
• Exercício 2: desabilitando constraints;
• Exercício 3: triggers;
SQL Server - Módulo I 26