sql >> Databasteknik >  >> RDS >> Oracle

Kan jag inaktivera en trigger inuti en trigger i Oracle?

Så här förstod jag frågan. Se om det hjälper.

Exempeltabeller:

SQL> create table test (id number);

Table created.

SQL> create table test_2 (id number);

Table created.

En utlösare på test_2 som förhindrar inlägg:

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.

Fungerar det?

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, det fungerar.

Nu en trigger på test vilket är tänkt att a) inaktivera trg2 trigger och b) infoga värde i test_2 . En enkel kod skulle då vara

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.

Låt oss testa det:

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'

A ha. Kan inte COMMIT i en trigger. Var är det? I dynamisk SQLs alter trigger - det är en DDL och det förbinder sig implicit. Hur "fixar" man det? Gör det (en trigger) till en autonom 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'

Det är ett annat fel; det står att - om vi har en autonom transaktion - måste vi antingen begå eller rulla tillbaka. Låt oss förbinda oss (för det är förmodligen vad du skulle vilja göra):

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>

Höger; nu fungerar det .

Jag föreslår att du läser kommentarerna under din fråga igen, tittar på det här exemplet och väljer vad du ska göra.




  1. Kan vi begränsa antalet rader i en tabell i MySQL?

  2. Hur listar du alla tabeller med dataändringar under de senaste 24 timmarna?

  3. Hur man extraherar en sträng mellan två specialtecken i mysql

  4. ProtocolViolation:FEL:bindningsmeddelande tillhandahåller 0 parametrar, men förberedd sats kräver 1