有没有办法避免 Oracle 中的触发器级联?

Is there any way to avoid trigger cascading in Oracle?

我有下表:

Table2 有一个触发器,当行被 删除.

时执行一些操作

当删除操作的源头是Table1级联时,有没有办法避免执行Table2中的触发器?

谢谢。

我认为没有现成的方法可以做到这一点,但您可以制作一个带有变量的包,该变量在一个触发器中设置并在下一个触发器中检查。

这些包变量是特定于会话的,因此您不会打扰其他会话,但您应该确保变量已重置,否则独立删除可能会被识别为同一会话中的级联删除。

大致应该是这样的:

create package PKG_CASCADE as 
  V_YOURFLAG char(1);
end package;
/

create package body PKG_CASCADE as

begin
  V_YOURFLAG := 'N';
end;
/

create trigger TDB_Table1 before delete on Table1
begin
  begin
    PKG_CASCADE.V_YOURFLAG := 'Y';

    delete from Table2 .....;

    PKG_CASCADE.V_YOURFLAG := 'N';
  exception when others do
    PKG_CASCADE.V_YOURFLAG := 'N';
  end;
end;
/

create trigger TDB_Table2 before delete on Table2
begin
  if PKG_CASCASE.V_YOURFLAG <> 'Y' then
    -- Do you stuff.
  end if;
end;
/

我在没有 Oracle 的情况下输入了这个,所以请原谅任何语法错误。

有关更详尽的教程,请参阅: