Oracle PL / SQL级联触发器删除未按预期工作

时间:2018-12-14 13:36:17

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

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

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约束应该在删除时级联?

1 个答案:

答案 0 :(得分:0)

我在下面的示例代码中对此进行了测试,它可以正常工作。 桌上还有其他触发器吗?或带有自引用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;