sql >> Databáze >  >> RDS >> Oracle

Mohu deaktivovat spoušť uvnitř spouště v oracle?

Takto jsem pochopil otázku. Podívejte se, jestli to pomůže.

Ukázkové tabulky:

SQL> create table test (id number);

Table created.

SQL> create table test_2 (id number);

Table created.

Spouštěč na test_2 který zabraňuje vkládání:

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.

Funguje to?

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'

Ano, funguje to.

Nyní spouštěč na test což má a) zakázat trg2 trigger a b) vložení hodnoty do test_2 . Přímý kód by pak byl

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.

Pojďme to otestovat:

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. Nelze COMMIT ve spoušti. Kde to je? V dynamickém SQL alter trigger - je to DDL a implicitně se zavazuje. Jak to "opravit"? Udělejte z toho (spouštěč) autonomní transakci:

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'

To je další chyba; říká, že - pokud máme autonomní transakci - musíme buď potvrdit, nebo vrátit zpět. Pojďme se zavázat (protože to je pravděpodobně to, co byste chtěli udělat):

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>

Že jo; teď to funguje .

Navrhuji, abyste si znovu přečetli komentáře zveřejněné pod vaší otázkou, prohlédli si tento příklad a vybrali, co dělat.




  1. Získejte DATETIME v php a vložte jej do MySQL pro konzistenci transakcí

  2. Porovnání dvojitého typu MySQL se nezdařilo

  3. Která syntaxe spojení je lepší?

  4. Odkazování na vnější dotaz v poddotazu