有没有办法避免 Oracle 中的触发器级联?
Is there any way to avoid trigger cascading in Oracle?
我有下表:
Table1 (Field_A)
Table2(Table1 中的Field_B 和Field_A 作为具有级联属性的外键约束)
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 的情况下输入了这个,所以请原谅任何语法错误。
有关更详尽的教程,请参阅:
我有下表:
Table1 (Field_A)
Table2(Table1 中的Field_B 和Field_A 作为具有级联属性的外键约束)
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 的情况下输入了这个,所以请原谅任何语法错误。
有关更详尽的教程,请参阅: