2
我有以下表:有什么办法可以避免在Oracle中触发级联?
表1(Field_A)
表2(Field_B和Field_A从表1,与级联属性一个ForeignKey约束)
表2有一个触发器,它执行某些操作时,行正在被删除。
有没有办法避免执行Table2中的触发器,当删除操作的起源是Table1级联?
谢谢。
我有以下表:有什么办法可以避免在Oracle中触发级联?
表1(Field_A)
表2(Field_B和Field_A从表1,与级联属性一个ForeignKey约束)
表2有一个触发器,它执行某些操作时,行正在被删除。
有没有办法避免执行Table2中的触发器,当删除操作的起源是Table1级联?
谢谢。
我不认为有这样一个开箱即用的方法,但你可以用一个变量来创建一个包,该变量被设置在一个触发器中并在下一个触发器中检查。
这些包变量是特定于会话的,因此您不会打扰其他会话,但您应确保重置该变量,否则独立删除可能会在同一会话中被识别为级联删除。
粗略地说,它应该是这样的:
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;
/
我手头输入这个没有甲骨文,所以请原谅我的语法错误。
更详尽的教程,请参阅:
触发器可以被禁用,特设的。否则,你可以在你的触发器中建立智能代码,即在条件下进行操作。触发器可能会被触发,但你可以决定你的触发器做什么,包括:什么也不做。 – tvCa 2015-01-04 17:11:26