Pular para o conteúdo

Alterando a Ordem de Execução de Triggers: Como controlar a sequência de disparo dos Triggers no banco de dados

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;

WSz5Mhq7dofpM21GjZ63gQkLePgMFN1go9zCliJ9lkaLA8X2rAV9Z

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;
Ordem de Execução de Triggers

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

Jefferson de Almeida Costa

Jefferson de Almeida Costa

Jefferson de Almeida Costa, formado em Ciência da Computação, com pós-graduação em MBA em Engenharia de Software Orientada a Serviços – SOA pela FIAP (Faculdade de Informática e Administração Paulista) e pós-graduando em MBA em Gestão de Projetos pela USP/Esalq. É desenvolvedor PL/SQL, com foco em Tuning/Performance e grandes volumes de dados, com certificações Oracle Certified Associate (OCA) e Oracle Certified Professional (OCP) em PL/SQL e Oracle Certified Expert (OCE) em SQL e SQL Tuning, bem como Agile Scrum Master (ASM) e ITIL Foundation (ITFL) pela Exin. Site: https://www.jeffersonacosta.com/

Comentário(s) da Comunidade

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress