我可以在 oracle 的触发器内禁用触发器吗?

时间:2021-01-02 01:12:45

标签: oracle

我有 2 个触发器和两个表。 一个(触发器)是在插入第一个表中的一行时插入另一个表中的一列,另一个防止在该列中插入和更新。 我想知道是否有办法禁用第二个触发器,以防止在第一个触发器执行期间插入/更新。

1 个答案:

答案 0 :(得分:1)

我是这样理解这个问题的。看看是否有帮助。

示例表:

<?php echo $myurl; ?>

防止插入的 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' 上的触发器应该 a) 禁用 test 触发器和 b) 将值插入 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' 。它在哪里?在动态 SQL 的 COMMIT 中 - 它是一个 DDL,它隐式提交。如何“修复”它?使其(触发器)成为自主事务:

alter trigger

这是另一个错误;它说 - 如果我们有一个自治事务 - 我们必须提交或回滚。让我们提交(因为这可能是您想要做的):

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'

对;现在它工作

我建议您重新阅读问题下方发布的评论,查看此示例并选择要执行的操作。