GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

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:

  1. Trigger tr_temp_3
  2. Trigger tr_temp_2
  3. 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;
O atributo alt desta imagem está vazio. O nome do arquivo é xdrotRYy0RusRfY7J3GNbhDWpCN-_-g_AzskZpGkAicOywKSLuUK-YqZb9ZvUBa5SYn7zKCbaElkBWuW5n-Z_mOgtAE0M3hi4J-WojcsK34vZFx9WjOLQDQZ-D0idzCk2j2Kuu87libfrBEMYg

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

http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/create_trigger.htm

Share

You may also like...

1 Response

  1. Theo disse:

    Muito util

Deixe um comentário

O seu endereço de e-mail não será publicado.