So habe ich die Frage verstanden. Sehen Sie, ob es hilft.
Beispieltabellen:
SQL> create table test (id number);
Table created.
SQL> create table test_2 (id number);
Table created.
Ein Trigger auf test_2
was Einfügungen verhindert:
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.
Funktioniert es?
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'
Ja, es funktioniert.
Jetzt ein Trigger auf test
was a) trg2
deaktivieren soll auslösen und b) Wert in test_2
einfügen . Ein einfacher Code wäre dann
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.
Testen wir es:
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'
Aha. COMMIT
nicht möglich in einem Auslöser. Wo ist es? Im alter trigger
von dynamischem SQL - Es handelt sich um eine DDL, die implizit festgeschrieben wird. Wie man es repariert? Machen Sie es (einen Trigger) zu einer autonomen Transaktion:
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'
Das ist ein weiterer Fehler; es besagt, dass wir - wenn wir eine autonome Transaktion haben - entweder festschreiben oder zurücksetzen müssen. Lassen Sie uns begehen (denn das ist wahrscheinlich das, was Sie tun möchten):
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>
Recht; jetzt funktioniert .
Ich schlage vor, dass Sie die unter Ihrer Frage geposteten Kommentare erneut lesen, sich dieses Beispiel ansehen und entscheiden, was zu tun ist.