sql >> Database >  >> RDS >> Oracle

Kan ik een trigger in een trigger in Oracle uitschakelen?

Zo heb ik de vraag begrepen. Kijk of het helpt.

Voorbeeldtabellen:

SQL> create table test (id number);

Table created.

SQL> create table test_2 (id number);

Table created.

Een trigger op test_2 wat invoegingen voorkomt:

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.

Werkt het?

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, het werkt.

Nu een trigger op test wat verondersteld wordt a) trg2 uit te schakelen trigger en b) waarde invoegen in test_2 . Een duidelijke code zou dan zijn

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.

Laten we het testen:

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. Kan niet COMMIT in een trekker. Waar is het? In dynamische SQL's alter trigger - het is een DDL en het verbindt zich impliciet. Hoe repareer je het? Maak er (een trigger) een autonome transactie van:

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'

Dat is een andere fout; het zegt dat - als we een autonome transactie hebben - we ofwel moeten committen of terug moeten draaien. Laten we ons verbinden (want dat is waarschijnlijk wat je zou willen doen):

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>

Rechts; nu werkt het .

Ik raad u aan de opmerkingen die onder uw vraag zijn geplaatst, opnieuw te lezen, dit voorbeeld te bekijken en te kiezen wat u wilt doen.




  1. PhalconPHP-database sluit zich aan bij ORM

  2. Hoe u aan Amazon MySQL RDS-certificaten kunt komen

  3. Is het een goede gewoonte om ContentProvider te gebruiken voor databasebewerkingen?

  4. Liquibase gebruiken om triggers te maken in mysql