【问题标题】:Is there any way to avoid trigger cascading in Oracle?有什么方法可以避免在 Oracle 中触发级联?
【发布时间】:2015-01-04 22:37:10
【问题描述】:

我有以下表格:

  • Table1(字段_A)

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

Table2 有一个触发器,当一行被删除时执行一些操作。

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

谢谢。

【问题讨论】:

  • 可以临时禁用触发器。否则,您可以在触发器中内置智能代码,根据条件进行操作。触发器可能会被触发,但您可以决定让触发器做什么,包括:什么都不做。

标签: oracle


【解决方案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;
/

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

更详细的教程见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多