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

时间:2015-01-04 14:21:19

标签: oracle

我有以下表格:

  • 表1 (Field_A)

  • Table2 (Field_B和Table1中的Field_A作为具有Cascade属性的ForeignKey约束)

Table2 有一个触发器,可在删除行时执行某些操作。

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

谢谢。

1 个答案:

答案 0 :(得分:1)

我不认为有一种开箱即用的方法可以做到这一点,但你可以创建一个包含变量的包,它在一个触发器中设置并在下一个中检查。

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

粗略地说,它应该是这样的:

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的情况下输入了这个,所以请原谅我的语法错误。

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