Oracle
 sql >> Base de données >  >> RDS >> Oracle

Puis-je désactiver un déclencheur à l'intérieur d'un déclencheur dans Oracle?

C'est ainsi que j'ai compris la question. Voyez si cela aide.

Exemples de tableaux :

SQL> create table test (id number);

Table created.

SQL> create table test_2 (id number);

Table created.

Un déclencheur sur test_2 qui empêche les insertions :

SQL> create or replace trigger trg2
  2    before insert or update on test_2
  3    for each row
  4  begin
  5    raise_application_error(-20000, 'Not allowed');
  6  end;
  7  /

Trigger created.

Est-ce que ça marche ?

SQL> insert into test_2 (id) values (1);
insert into test_2 (id) values (1)
            *
ERROR at line 1:
ORA-20000: Not allowed
ORA-06512: at "SCOTT.TRG2", line 2
ORA-04088: error during execution of trigger 'SCOTT.TRG2'

Oui, ça marche.

Maintenant, un déclencheur sur test qui est censé a) désactiver trg2 déclencheur et b) insérer la valeur dans test_2 . Un code simple serait alors

SQL> create or replace trigger trg1
  2    before insert on test
  3    for each row
  4  begin
  5    execute immediate 'alter trigger trg2 disable';
  6    insert into test_2 (id) values (:new.id);
  7  end;
  8  /

Trigger created.

Testons-le :

SQL> insert into test (id) values (1);
insert into test (id) values (1)
            *
ERROR at line 1:
ORA-04092: cannot COMMIT in a trigger
ORA-06512: at "SCOTT.TRG1", line 2
ORA-04088: error during execution of trigger 'SCOTT.TRG1'

Ah. Impossible de COMMIT dans un déclencheur. Où est-il? Dans le alter trigger du SQL dynamique - c'est un DDL et il s'engage implicitement. Comment le réparer? Faites-en (un déclencheur) une transaction autonome :

SQL> create or replace trigger trg1
  2    before insert on test
  3    for each row
  4  declare
  5    pragma autonomous_transaction;
  6  begin
  7    execute immediate 'alter trigger trg2 disable';
  8    insert into test_2 (id) values (:new.id);
  9  end;
 10  /

Trigger created.

SQL> insert into test (id) values (1);
insert into test (id) values (1)
            *
ERROR at line 1:
ORA-06519: active autonomous transaction detected and rolled back
ORA-06512: at "SCOTT.TRG1", line 6
ORA-04088: error during execution of trigger 'SCOTT.TRG1'

C'est une autre erreur; il dit que - si nous avons une transaction autonome - nous devons soit valider, soit annuler. Engageons-nous (parce que c'est probablement ce que vous voudriez faire) :

SQL> create or replace trigger trg1
  2    before insert on test
  3    for each row
  4  declare
  5    pragma autonomous_transaction;
  6  begin
  7    execute immediate 'alter trigger trg2 disable';
  8    insert into test_2 (id) values (:new.id);
  9    commit;
 10  end;
 11  /

Trigger created.

SQL> insert into test (id) values (100);

1 row created.

SQL> select * From test;

        ID
----------
       100

SQL> select * from test_2;

        ID
----------
       100

SQL>

Droit; maintenant ça fonctionne .

Je vous suggère de relire les commentaires postés sous votre question, de voir cet exemple et de choisir quoi faire.