2008.2
Triggers
Renata Viegas
2008.2
Gatilhos (Triggers)
• Utilizados para implementar regras de
negócio da aplicação
• Sua principal aplicação é a criação de
restrições e consistências de acesso ao
banco de dados
2008.2
Gatilhos (Triggers)
• Exemplo: Ao invés de restringir contas
com saldos negativos, podemos querer
ativar uma ação que automaticamente
inicia um empréstimo para aquela conta
2008.2
Gatilhos (Triggers)
• Um trigger é um conjunto de
comandos SQL que é automaticamente
disparado quando um comando INSERT,
UPDATE ou DELETE é executado em
uma tabela.
2008.2
Gatilhos (Triggers)
• Um trigger é uma regra do tipo E_C_A:
– E: Evento
– C: Condição a ser satisfeita na presença do
evento E
– A: Ação a ser tomada caso a condição C
seja satisfeita
2008.2
Gatilhos (Triggers)
• Voltando ao nosso exemplo:
– Ao invés de restringir contas com saldos
negativos, podemos querer ativar uma ação que
automaticamente inicia um empréstimo para
aquela conta.
• Evento: operação de modificação do saldo
• Condição: se saldo < 0
• Ação: Criar um empréstimo para conta
2008.2
Gatilhos (Triggers)
• Composição de um trigger
– Um nome: único para cada banco de dados
– A maneira: um comando INSERT, UPDATE ou DELETE
– As instruções: Um bloco de comandos SQL
• Vínculo de um trigger
– Os gatilhos (triggers) são sempre vinculados a uma
determinada tabela
– Quando uma tabela é removida, todos os gatilhos
relacionados serão excluídos automaticamente.
2008.2
Gatilhos no SQL Server
• Funcionamento
– Quando um trigger é executado, o SQL Server cria duas
tabelas temporárias que ficam residentes na memória e
existem apenas enquanto o trigger estiver ativo.
– As duas tabelas contêm a mesma estrutura da tabela de
base onde o trigger foi criado.
• Essas duas tabelas recebem o nome de INSERTED e DELETED.
• Você pode consultar dados nessa tabela com o SELECT, da
mesma forma que uma tabela real
2008.2
Gatilhos no SQL Server
• Funcionamento (cont.)
– Quando um comando INSERT é executado, o registro
criado será copiado para a tabela de base e para a tabela
INSERTED.
– Quando um comando UPDATE é executado, o registro
original (registro antigo) é armazenado na tabela
DELETED e o registro modificado (registro atual) é
armazenado na tabela de base e na tabela INSERTED.
– Quando um comando DELETE é executado, o registro
excluído é armazenado na tabela DELETED.
2008.2
Gatilhos no SQL Server
• Os momentos de disparo são definidos para
atuarem quando o respectivo comando de
modificação for executado
– Um trigger de INSERT não vai ser disparado quando a
tabela sofre um UPDATE
2008.2
Gatilhos (Triggers)
• Sintaxe :
CREATE TRIGGER <nome> ON <tabela>
FOR [INSERT][,][UPDATE][,][DELETE]
AS <comandos SQL>
2008.2
Gatilhos (Triggers)
Create Table ExemploTrigger (
Id Int
Campo Varchar(10))
2008.2
Gatilhos (Triggers)
Create Trigger Exemplo On ExemploTrigger
For Insert, Update, Delete
As
Begin
If Exists (Select Id From Deleted)
Begin
If Exists (Select Id From Inserted)
Begin
Print 'Foi feito um Update'
End
Else
Begin
Print 'Foi feito um Delete'
End
End
Else
Begin
Print 'Foi feito um insert'
End
End
2008.2
Gatilhos (Triggers)
Create Table Estoque
(Id Int,
Produto Char(10),
Qtd Int,
QtdMinima Int)
Create Table Compras (Id Int, Qtd Int)
Create
Table
Vendas
(Id
Int,
Qtd
Int)
2008.2
Gatilhos (Triggers)
• Quando um produto é comprado, acrescenta-se um item do
produto no estoque (O estoque é atualizado
automaticamente)
Create Trigger TrCompras On Compras
For Insert As
Begin
Update Estoque
Set Estoque.Qtd = Estoque.Qtd + Inserted.Qtd
From Estoque, Inserted
Where Inserted.Id = Estoque.Id
End
2008.2
Gatilhos (Triggers)
• Ao vender um produto, a quantidade em estoque deve ser
decrementada. E deve-se comparar com sua quantidade
mínima em estoque.
Create Trigger TrVendas On Vendas
For Insert As
Begin
Update Estoque
Set Estoque.Qtd = Estoque.Qtd - Inserted.Qtd
From Estoque, Inserted Where Inserted.Id = Estoque.Id
If Exists (Select Id From Estoque Where Qtd <= QtdMinima)
PRINT 'Existem Produtos em Falta'
End
2008.2
Gatilhos (Triggers)
• Voltando ao nosso exemplo:
– Ao invés de restringir contas com saldos
negativos, podemos querer ativar uma ação que
automaticamente inicia um empréstimo para
aquela conta.
• Crie um Trigger !
conta (numero, titular, saldo)
emprestimo (cod_emprestimo, numConta, valor)
2008.2
Gatilhos (Triggers)
create trigger EmprestimoAuto on Conta
For Update
as
begin
If exists (select numero from inserted where saldo <= 0)
begin
declare @numC int, @valor money
Set @numC = (select numero from inserted
where saldo <= 0)
Set @valor = (select d.saldo + i.saldo from inserted i,
deleted d)
insert into emprestimo values (1, @numC, @valor)
print 'Foi feito um emprestimo automático'
end
end
2008.2
Gatilhos (Triggers)
• Observações importantes
– Triggers não podem ser criadas para Visões ou tabelas
temporárias
– Triggers não possuem parâmetros e não podem ser
explicitamente invocados.
• São disparados quando os dados da “tabela protegida” são
modificados
– Triggers são considerados como parte de uma transação
• Se houver falha no seu funcionamento, os comandos serão
revertidos (ROLLBACK)
2008.2
Gatilhos no SQL Server
• Detalhe…
– No SQL Server, os trigger são disparados após
um INSERT, UPDATE ou DELETE
– Conclusão: não existe o momento BEFORE
nem AFTER
Download

Gatilhos (Triggers)