【问题标题】:Oracle PL/SQL cascading trigger delete not working as expectedOracle PL/SQL 级联触发器删除未按预期工作
【发布时间】:2019-05-15 18:55:24
【问题描述】:

我遇到了外键问题。我创建了一组触发器,如果​​表中的一行被删除,则应该通过数据库级​​联删除,以便删除其所有子项(以及这些子项的子项)。这是此类触发器的示例。

create or replace trigger trigg_delet_child before delete on PARENT for 
each row
begin
    delete from CHILD where foreign_key_parent_id = :old.id_parent;
end;

我在每张桌子上都有一组这样的触发器。我假设由于触发器应该在 执行删除语句之前触发,因此将火炬传递到较低和较低的表,直到我们最终点击没有子项的项目并从那里开始删除并向上工作.

情况似乎并非如此,因为违反了 foreign_key 约束是可以理解的,因为显然我误解了 BEFORE 的工作原理。有没有办法在不指定foreign_key 约束应在删除时级联的情况下回避这个问题?

【问题讨论】:

  • 使用on delete cascade定义的外键有什么问题?
  • 1) 它不适用于具有来自图腾柱较高的两个表的外键的表。或者至少,有人告诉我。 2)这项工作是课堂练习。优先事项是练习触发器、程序和功能。我可以通过创建删除过程并以正确的顺序调用它们来轻松解决这个问题,但我想尝试一下触发器。
  • 当然你需要对“图腾柱”中的所有外键都这样做
  • 那么让我们假设“on delete cascade”约束不存在。我猜我需要使用过程/函数是否正确,或者是否有某种方法可以实际触发上述触发器?
  • 改成after delete不行吗?

标签: oracle plsql triggers foreign-keys sql-delete


【解决方案1】:

我在下面的示例代码中试了一下,它可以工作。 你在桌子上有其他触发器吗?还是带有自引用 FK 的表?

    Create table a (a_id number primary key, 
                a_text varchar2(10));

Create table b (b_id number primary key, 
                a_id number REFERENCES a (a_id),
                b_text varchar2(10));

Create table c (c_id number primary key, 
                b_id number REFERENCES b (b_id), 
                c_text varchar2(10));



Insert into a values(1 , 'A');
Insert into b values(11, 1, 'B');
Insert into c values(101, 11, 'C');
commit;

-- Generates an error
Delete from a;

create or replace trigger A_DEL before delete on a for 
each row
begin
    delete from B where A_id = :old.A_ID;
end;
/

create or replace trigger B_DEL before delete on B for 
each row
begin
    delete from C where B_id = :old.B_ID;
end;
/

-- Works
Delete from a;
COMMIT;

【讨论】:

  • 我实际上没有自引用外键。我确实有其他触发器,但它们正在更新,不应干扰。谢谢,这意味着我实际上在某个地方犯了错误,而不是在本质上是错误的事情上大发雷霆。
  • 最后,错误再次体现在键盘和椅子之间的空间。我忘记为一个绑定到我删除的表的表编译触发器。这阻止了删除。不过,感谢您愿意提供帮助。 (我也很尴尬,我花了这么长时间才发现那个错误)
猜你喜欢
  • 2011-08-06
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多