我可以在oracle中禁用触发器中的触发器吗?
我有两个触发器和两个表。 一个(触发器)是在插入第一个表中的行时插入另一个表中的一列,另一个触发器阻止在该列中插入和更新。我可以在oracle中禁用触发器中的触发器吗?,oracle,Oracle,我有两个触发器和两个表。 一个(触发器)是在插入第一个表中的行时插入另一个表中的一列,另一个触发器阻止在该列中插入和更新。 我想知道是否有一种方法可以禁用第二个触发器,从而在执行第一个触发器时阻止插入/更新。我就是这样理解这个问题的。看看是否有帮助 示例表: SQL> create table test (id number); Table created. SQL> create table test_2 (id number); Table created. test_2
我想知道是否有一种方法可以禁用第二个触发器,从而在执行第一个触发器时阻止插入/更新。我就是这样理解这个问题的。看看是否有帮助 示例表:
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
上的触发器应该是a)禁用trg2
触发器,b)将值插入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的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'
这是另一个错误;它说,如果我们有一个自治事务,我们要么提交,要么回滚。让我们承诺(因为这可能是您想要做的):
对,;现在它起作用了
我建议你重新阅读问题下方的评论,看看这个例子,然后选择怎么做。你自己试过吗?你发现什么错误了吗?当我在触发器里面写“alter trigger name\u of\u trigger disable”的时候,我告诉我我不能在触发器里面这么做。在“alter”下面显示语法错误alter触发器是DDL,如果要从PL/SQL代码执行DDL,则必须使用EXECUTE IMMEDIATE“alter triggername DISABLE”。尝试使用EXECUTE IMMEDIATE。Oracle没有在触发器@hkandpal内执行它。Oracle只是跳过了这条线。DDL不能在单个DML事务的范围内执行:您不能将其嵌入到本质上是DML一部分的触发器中。您必须首先单独执行DDL,以便对所有事务禁用触发器,然后执行DML、提交,然后重新启用触发器。在第二个触发器中包含逻辑以确定何时应该和不应该允许插入/更新会更简单。完美的人,非常感谢你。
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>