Prévia do material em texto
25/10/2010
1
Prof. Esp. André Ricardo Jovetta
� São iguais a stored procedures com as seguintes exceções:
1. são chamadas automaticamente quando os dados da tabela a
qual ela esta conectada são alterados;
2. não tem parâmetros de entrada;
3. não retornam valores;
4. são criadas pelo comando CREATE TRIGGER.
� A sintaxesintaxesintaxesintaxe para a criação de uma trigger é apresentada abaixo:
CREATE TRIGGER name FOR {table view}
[ACTIVE | INACTIVE]
{BEFORE AFTER} {DELETE INSERT UPDATE}
[POSITION number]
AS
=DECLARE VARIABLE variable
datatype;
[DECLARE VARIABLE variable datatype;...]
BEGIN
END
� tabletabletabletable viewviewviewview:::: é o nomenomenomenome tabelatabelatabelatabela ouououou viewviewviewview que estará associada à
trigger;
� activeactiveactiveactive inactiveinactiveinactiveinactive:::: indica se a trigger estará ativaativaativaativa ouououou nãonãonãonão;
� beforebeforebeforebefore afterafterafterafter:::: indica em que momentomomentomomentomomento a trigger será
disparadadisparadadisparadadisparada. A trigger pode ser disparadisparadisparadispara antesantesantesantes ouououou depoisdepoisdepoisdepois de um
evento de DELETE,DELETE,DELETE,DELETE, UPDATEUPDATEUPDATEUPDATE ouououou INSERTINSERTINSERTINSERT.
25/10/2010
2
� delete insert update: indica em qual evento a trigger será
executada;
� Position: é utilizado para definir a sequência de execução de
triggers que estão associadas a um mesmo momento e evento. Por
exemplo, posso ter duas triggers do tipo BEFORE DELETE. Como
saber qual delas será executada primeiro? O parâmetro
POSITION indicará isso;
� trigger body :é o corpo da trigger, o código dela.
CREATE EXCEPTION EX_DELETE 'Não é possível excluir um
cliente!';
COMMENT ON EXCEPTION EX_DELETE IS
'Não é possível excluir um cliente!';
CREATE TRIGGER TRIGGER_DELETE_CLIENTE FOR CLIENTE
ACTIVE BEFORE DELETE POSITION 0
AS
begin
exception ex_delete;
end
� O comando "FOR Cliente" indica que esta trigger vai ser
disparada quando houver algum evento de DELETE, UPDATE ou
INSERT na tabela. Mas qual evento? Isso está especificado na
linha "BEFORE DELETE", indicando que a trigger será executada
antes de ocorrer um comando DELETE;
� O corpo dessa trigger possui apenas uma linha importante,
"EXCEPTION EX_DELETE;".
� Este comando dispara a exceção anteriormente criada, cancelando
a ação que está sendo executada, ou seja, cancelando o
comando DELETE.
� Assim, percebemos que a única função desta trigger é evitar
qualquer exclusão da tabela “Cliente".
� AAAA variávelvariávelvariávelvariável NEW,NEW,NEW,NEW, nononono casocasocasocaso dodododo INSERT,INSERT,INSERT,INSERT, armazenaarmazenaarmazenaarmazena oooo registroregistroregistroregistro quequequeque
estáestáestáestá sendosendosendosendo inseridoinseridoinseridoinserido.... NoNoNoNo casocasocasocaso dodododo UPDATE,UPDATE,UPDATE,UPDATE, armazenaarmazenaarmazenaarmazena oooo registroregistroregistroregistro
depoisdepoisdepoisdepois dededede atualizadoatualizadoatualizadoatualizado;;;;
� AAAA variávelvariávelvariávelvariável OLD,OLD,OLD,OLD, nononono casocasocasocaso dodododo DELETE,DELETE,DELETE,DELETE, armazenaarmazenaarmazenaarmazena oooo registroregistroregistroregistro quequequeque
estáestáestáestá sendosendosendosendo excluídoexcluídoexcluídoexcluído.... NoNoNoNo casocasocasocaso dodododo UPDATE,UPDATE,UPDATE,UPDATE, armazenaarmazenaarmazenaarmazena oooo
registroregistroregistroregistro antesantesantesantes dededede sofrersofrersofrersofrer aaaa atualizaçãoatualizaçãoatualizaçãoatualização;;;;
�
25/10/2010
3
� Por exemplo, em uma tabela possui os campos IDADE e TIPO.
O campo TIPO é atualizado de acordo com o valor do campo
IDADE:
� Se IDADE 18, então TIPO deve ser A.
create table pessoa
(
cod int not null,
idade int not null,
tipo char(1),
primary key (cod)
);
CREATE TRIGGER ATUALIZA_PESSOA FOR PESSOA
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
begin
if (NEW.idade