You are on page 1of 20

2008.

Triggers

Renata Viegas

2008.2

Gatilhos (Triggers)

Utilizados para implementar regras


de negcio da aplicao
Sua principal aplicao a criao
de restries e consistncias de
acesso ao banco de dados

2008.2

Gatilhos (Triggers)

Exemplo: Ao invs de restringir


contas com saldos negativos,
podemos querer ativar uma ao
que automaticamente inicia um
emprstimo 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: Condio a ser satisfeita
presena do evento E
A: Ao a ser tomada caso
condio C seja satisfeita

na
a

2008.2

Gatilhos (Triggers)

Voltando ao nosso exemplo:


Ao invs de restringir contas com saldos
negativos, podemos querer ativar uma
ao que automaticamente inicia um
emprstimo para aquela conta.
Evento: operao de modificao do saldo
Condio: se saldo < 0
Ao: Criar um emprstimo para conta

2008.2

Gatilhos (Triggers)
Composio de um trigger
Um nome: nico para cada banco de dados
A maneira: um comando INSERT, UPDATE ou
DELETE
As instrues: Um bloco de comandos SQL

Vnculo de um trigger
Os gatilhos (triggers) so sempre vinculados a
uma determinada tabela
Quando uma tabela removida, todos os gatilhos
relacionados sero excludos automaticamente.

2008.2

Gatilhos no SQL Server


Funcionamento
Quando um trigger executado, o SQL Server cria
duas tabelas temporrias que ficam residentes na
memria e existem apenas enquanto o trigger
estiver ativo.
As duas tabelas contm 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 excludo armazenado na tabela
DELETED.

2008.2

Gatilhos no SQL Server


Os momentos de disparo so definidos para
atuarem quando o respectivo comando de
modificao for executado
Um trigger de INSERT no 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 mnima 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 <= QtdMin
PRINT 'Existem Produtos em Falta'
End

2008.2

Gatilhos (Triggers)

Voltando ao nosso exemplo:


Ao invs de restringir contas com saldos
negativos, podemos querer ativar uma
ao que automaticamente inicia um
emprstimo para aquela conta.

Crie um Trigger !
conta (numero, titular, saldo)
emprestimo
(cod_emprestimo,
valor)

numConta,

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 automtico'
end
end

2008.2

Gatilhos (Triggers)
Observaes importantes
Triggers no podem ser criadas para Vises ou
tabelas temporrias
Triggers no possuem parmetros e no podem
ser explicitamente invocados.
So disparados quando os dados da tabela protegida
so modificados

Triggers so considerados como parte de uma


transao
Se houver falha no seu funcionamento, os comandos
sero revertidos (ROLLBACK)

2008.2

Gatilhos no SQL Server

Detalhe
No SQL Server, os trigger so disparados
aps um INSERT, UPDATE ou DELETE
Concluso: no existe o momento
BEFORE nem AFTER