首页 > 解决方案 > Oracle PL/SQL 级联触发器删除未按预期工作

问题描述

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

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约束应该级联删除的情况下回避这个问题?

标签: oracleplsqltriggersforeign-keyssql-delete

解决方案


我在下面的示例代码中试了一下,它可以工作。你在桌子上有其他触发器吗?还是带有自引用 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;

推荐阅读