SQL Server 2008 – 多个级联 FK – 我需要触发器吗?
本教程将介绍SQL Server 2008 - 多个级联 FK - 我需要触发器吗?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。
问题描述
我在 User 和 Post 之间有 1..* 关系.(一个用户有很多帖子)
Post 有一个名为UserId"的 FK,它映射到 User 表上的UserId"字段.
我尝试将此 FK 设置为 Cascade UPDATE/DELETE,但出现此错误:
用户"表保存成功帖子"表- 无法创建关系FK_Posts_Users".
在表 'Posts' 上引入 FOREIGN KEY 约束 'FK_Posts_Users' 可能会导致循环或多个级联路径.指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束.无法创建约束.查看以前的错误.
我有一个名为 PostHelpful 的表格.一个帖子有很多 Helpful.
Helpful 对 User 有一个级联的 FK(所以当一个 User 被删除时,他们的 Helpful 也会被删除).
但我认为这是抱怨多级联路径"的原因.
因为如果我(当前)删除用户,它将删除他们的帮助.但是我也试图向 Post 添加一个级联,这样做会删除 Post,然后尝试删除该 Post 的 Helpful(因为 Helpful 也有一个级联的 FK 到 Post).在那种情况下,SQL 会选择哪个级联 FK?
下面是这三个表的数据库图:
如您所见,PostHelpful"是Post"和User"的子项(对两者都有 FK).
所以我不能让两个键级联?我是否需要用户"上的触发器(删除后)来手动删除帮助信息(以及引用用户的其他表).
推荐答案
SQL Server 选择哪条路径无关紧要,它不允许这样做,以免陷入妥协的境地.当我们遇到这种情况时,我们不得不求助于触发器.
1) 如错误消息所述,将 Users_PostHelpfuls FK 更改为 ON DELETE NO ACTION.
2) 向用户添加 INSTEAD OF DELETE 触发器:
CREATE TRIGGER dbo.Users_IO_Delete
ON dbo.Users
INSTEAD OF DELETE
AS
BEGIN;
DELETE FROM dbo.PostHelpfuls WHERE UserId IN (SELECT UserId FROM deleted);
DELETE FROM dbo.Users WHERE UserId IN (SELECT UserId FROM deleted);
END;
现在,FK 仍将强制执行 DRI,但触发器是级联删除而不是 FK 约束.
您可以在上述步骤中将 PostHelpfuls 替换为 Posts.但是这样做时最好使用触发器来删除不太独立的实体的记录.换句话说,与 PostHelpfuls 与 Users 和 PostHelpfuls 旁边的表相关的可能性更高用户和帖子旁边的表格.
好了关于SQL Server 2008 - 多个级联 FK - 我需要触发器吗?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。