2015-01-04 58 views
2

我有以下表:有什么办法可以避免在Oracle中触发级联?

  • 表1(Field_A)

  • 表2(Field_B和Field_A从表1,与级联属性一个ForeignKey约束)

表2有一个触发器,它执行某些操作时,行正在被删除

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

谢谢。

+0

触发器可以被禁用,特设的。否则,你可以在你的触发器中建立智能代码,即在条件下进行操作。触发器可能会被触发,但你可以决定你的触发器做什么,包括:什么也不做。 – tvCa 2015-01-04 17:11:26

回答

1

我不认为有这样一个开箱即用的方法,但你可以用一个变量来创建一个包,该变量被设置在一个触发器中并在下一个触发器中检查。

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

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

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; 
/

我手头输入这个没有甲骨文,所以请原谅我的语法错误。

更详尽的教程,请参阅:

相关问题