Alterando a Ordem de Execução de Triggers
O Trigger é a melhor e a pior feature do banco de dados. É a melhor, pois permite efetuar diversas validações ou aplicação de regras de negócios complexas que as constraints não conseguiriam implementar. É a pior, pois muitos apenas se lembram de triggers após a alteração, deleção ou inserção dos dados e o mesmo já disparou informações para tudo quanto é lado, que talvez, não fosse a ideia principal, além de ter que entender quando um trigger de fato faz sentido, porque junto com ele vem a degradação de performance. É mais ou menos igual ao Wesley, 99% anjo, mas aquele 1%…
Ainda, sempre existe uma grande dificuldade de ter controle sobre Triggers, haja vista que os mesmos não têm uma ordem lógica, principalmente, quanto à execução. Pensando nisto, no Oracle 11g foi criada a cláusula FOLLOWS o qual permite estipular a ordem desejada para que os triggers sejam disparados.
Abaixo foi criado três Triggers simples, com intuito apenas de exemplificar a alteração de ordem de execução conforme a utilização da cláusula Follows.
Criação da tabela que receberá os triggers.
CREATE TABLE temp_teste_2
(
my_id NUMBER,
numero NUMBER,
seq NUMBER NOT NULL
);
Agora criaremos os Triggers sem a cláusula Follow e iremos dispará-los para verificar sua ordem.
CREATE OR replace TRIGGER tr_temp_1
BEFORE INSERT ON temp_teste_2
FOR EACH ROW
BEGIN
dbms_output.Put_line('Disparou Trigger tr_temp_1');
END;
CREATE OR replace TRIGGER tr_temp_2
BEFORE INSERT ON temp_teste_2
FOR EACH ROW
BEGIN
dbms_output.Put_line('Disparou Trigger tr_temp_2');
END;
CREATE OR replace TRIGGER tr_temp_3
BEFORE INSERT ON temp_teste_2
FOR EACH ROW
BEGIN
dbms_output.Put_line('Disparou Trigger tr_temp_3');
END;
SET serveroutput ON
INSERT INTO temp_teste_2(my_id, numero, seq) VALUES (1, 1, 1);
ROLLBACK;
Observe que para este caso, o disparo foi feito em ordem decrescente de compilação (isto nem sempre é verdade), sendo:
- Trigger tr_temp_3
- Trigger tr_temp_2
- Trigger tr_temp_1
Agora, iremos utilizar a cláusula Follows para manipular a ordem de execução dos Triggers. A ideia neste caso é disparar primeiro TR_TEMP_2, em segundo TR_TEMP_1 e por último TR_TEMP_3. Vamos compilar novamente os Triggers, agora com a cláusula Follows.
CREATE OR replace TRIGGER tr_temp_1
BEFORE INSERT ON temp_teste_2
FOR EACH ROW FOLLOWS tr_temp_2
BEGIN
dbms_output.Put_line('Disparou Trigger tr_temp_1');
END;
CREATE OR replace TRIGGER tr_temp_2
BEFORE INSERT ON temp_teste_2
FOR EACH ROW
BEGIN
dbms_output.Put_line('Disparou Trigger tr_temp_2');
END;
CREATE OR replace TRIGGER tr_temp_3
BEFORE INSERT ON temp_teste_2
FOR EACH ROW FOLLOWS tr_temp_1
BEGIN
dbms_output.Put_line('Disparou Trigger tr_temp_3');
END;
SET serveroutput ON
INSERT INTO temp_teste_2(my_id, numero, seq) VALUES (1, 1, 1);
ROLLBACK;
Veja que agora o disparo obedeceu à ordem imposta nas declarações dos Triggers, tornando o controle mais maleável, haja vista que podemos escolher a precedência de cada execução.
Referências
Muito util
Quebrou um galhão! Valeu pela ajuda!