oracle - 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约束应该级联删除的情况下回避这个问题?
解决方案
我在下面的示例代码中试了一下,它可以工作。你在桌子上有其他触发器吗?还是带有自引用 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;
推荐阅读
- reactjs - I have a problem where my onclick only work once
- javascript - 当鼠标悬停到任何其他位置时如何使下拉菜单自动关闭
- r - 重命名大数据表的列名(日期格式)
- amazon-web-services - Amazon S3 存储桶 GET 请求计数
- c++ - 如何在不四舍五入的情况下获得精确的输出?
- python - 有什么有效的方法来存储 numpy 数组
- c++ - 如何使用 vcpkg 和 cmake 链接 VScode 中的 boost 库?
- swift - SwiftUI - 日期处理
- python - 根据另一个列表删除列表中的项目
- python - 如何在运行时隐藏 PyInstaller 可执行文件生成的资源文件?