Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在oracle中禁用触发器中的触发器吗?_Oracle - Fatal编程技术网

我可以在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>