Oracle
 sql >> база данни >  >> RDS >> Oracle

Мога ли да деактивирам тригер вътре в тригер в oracle?

Аз така разбрах въпроса. Вижте дали помага.

Примерни таблици:

SQL> create table test (id number);

Table created.

SQL> create table test_2 (id number);

Table created.

Тригер на test_2 което предотвратява вмъквания:

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.

Работи ли?

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'

Да, работи.

Сега тригер на test което трябва да а) деактивира trg2 тригер и б) вмъкнете стойност в test_2 . Тогава прост код ще бъде

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.

Нека го тестваме:

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'

Аха Не може COMMIT в спусъка. Къде е? В динамичния SQL alter trigger - това е DDL и имплицитно се ангажира. Как да го "оправим"? Направете го (тригер) автономна транзакция:

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'

Това е друга грешка; той казва, че - ако имаме автономна транзакция - трябва или да се ангажираме, или да върнем обратно. Нека се ангажираме (защото вероятно това е, което бихте искали да направите):

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>

точно; сега работи .

Предлагам ви да прочетете отново коментарите, публикувани под въпроса ви, да видите този пример и да изберете какво да направите.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Команда за търсене за търсене на колона/поле в SQLPLUS за Oracle 10.2

  2. Как да свържете R към Oracle?

  3. ClassNotFoundException:oracle.jdbc.OracleDriver

  4. как да попълните база данни с помощта на процедури

  5. Какво не е наред с инсталирането на php oracle клиент oci8