Ordenando a execução de TRIGGER com Oracle 11g

Até o Oracle 11g,  nas versões anteriores não era possivel ordenar a execução de trigger irei demonstrar que com o Oracle 11g podemos determinar a ordem de execução das triggers de uma tabela que são de um mesmo tipo. Na criação de uma trigger no Oracle 11g, existe uma nova cláusula chamada "follows" que nos permitirá definir a ordem de execução das mesmas.

 

No primeiro exemplo abaixo, irei criar 3 triggers do tipo BEFORE INSERT sem definir uma ordem de execução.

C:\>sqlplus scott/tiger

SQL*Plus: Release 11.2.0.1.0 Production on Qua Ago 3 21:34:36 2011
Copyright (c) 1982, 2010, Oracle. All rights reserved.

Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create table t1 (id number);

Tabela criada.

SQL> create or replace trigger trg_teste_01
before insert on t1
for each row
begin
dbms_output.put_line('trigger trg_teste_01');
end;


Gatilho criado.

SQL> create or replace trigger trg_teste_02
before insert on t1
for each row
begin
dbms_output.put_line('trigger trg_teste_02');
end;


Gatilho criado.

SQL> create or replace trigger trg_teste_03
before insert on t1
for each row
begin
dbms_output.put_line('trigger trg_teste_03');
end;


Gatilho criado.


Após a criação da tabela e das triggers, irei inserir um registro na tabela T1.

SQL> set serveroutput on
SQL> insert into t1 values (1);
trigger trg_teste_03
trigger trg_teste_02
trigger trg_teste_01

1 linha criada.
Perceberam que a trigger trg_teste_03 foi acionada primeiro? Quem garante que a mesma será executada primeiro na próxima vez? Bom, no segundo exemplo abaixo irei criar novamente as triggers só que, agora, definindo a ordem de execução:trg_teste_01, depois trg_teste_02 e depois trg_teste_03.

SQL> create or replace trigger trg_teste_01
before insert on t1
for each row
begin
dbms_output.put_line('trigger trg_teste_01');
end;


Gatilho criado.

SQL> create or replace trigger trg_teste_02
before insert on t1
for each row
follows trg_teste_01
begin
dbms_output.put_line('trigger trg_teste_02');
end;

Gatilho criado.

SQL> create or replace trigger trg_teste_03
before insert on t1
for each row
follows trg_teste_02
begin
dbms_output.put_line('trigger trg_teste_03');
end;


Gatilho criado.

SQL> insert into t1 values (2);
trigger trg_teste_01
trigger trg_teste_02
trigger trg_teste_03

1 linha criada.
Pronto. Podemos ver que as mesmas foram acionadas de acordo com a ordem que eu havia definido anteriormente. Poderíamos inclusive desabilitar uma das triggers que não haveria problema nenhum:
SQL> alter trigger trg_teste_02 disable;

Gatilho alterado.

SQL> insert into t1 values (3);
trigger trg_teste_01
trigger trg_teste_03

1 linha criada.
Agora, caso alguma trigger que é dependente de outra for dropada, aí sim teremos problemas pois não conseguiremos realizar algumas operações até que o problema seja sanado.

 

SQL> drop trigger trg_teste_02;

Gatilho eliminado.

SQL> select object_name,status from user_objects where object_type='TRIGGER';

OBJECT_NAME STATUS
------------------------------ -------
TRG_TESTE_01 VALID
TRG_TESTE_03 INVALID


SQL> insert into t1 values (3);
insert into t1 values (3)
*
ERRO na linha 1:
ORA-04045: erros durante a recompilação/revalidação de SCOTT.TRG_TESTE_03
ORA-04098: gatilho 'SCOTT.TRG_TESTE_03' é inválido e a revalidação falhou

SQL> drop table t1;
drop table t1
*
ERRO na linha 1:
ORA-00604: ocorreu um erro no nível 1 SQL recursivo
ORA-04045: erros durante a recompilação/revalidação de SCOTT.TRG_TESTE_03
ORA-04098: gatilho 'SCOTT.TRG_TESTE_03' é inválido e a revalidação falhou

SQL> alter trigger trg_teste_03 disable;

Gatilho alterado.

SQL> insert into t1 values (4);
trigger trg_teste_01

1 linha criada.

SQL> drop table t1;

Tabela eliminada.


Caso alguém saiba uma forma mais otimizada me mande é sempre bom compartilhar o que aprendemos :).

Exibições: 97

Comentar

Você precisa ser um membro de DevBrasil para adicionar comentários!

Entrar em DevBrasil

Comentário de Pedro Ivo Faria do Amaral em 2 abril 2016 às 9:16

Cara, tem um erro de síntese nas entranhas dos arg para o processo. Use algo mais simple para a aderência total do conteúdo base, da essência do processo.Percebi que suas declarações vão ser "retardadas" a partir do momento que tivermos vários args em relação intro-developer 

© 2017   Criado por Ramon Durães.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço