SQL Server 2008 - 多个级联FK - 我需要一个触发器吗?

时间:2011-02-24 04:56:01

标签: sql-server sql-server-2008 foreign-keys cascading-deletes relationships

我与用户发布之间存在1 .. *关系。 (一个用户有很多帖子)

帖子有一个名为“UserId”的FK,它映射到用户表上的“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的表。 One Post有很多帮助。

有用的是向用户级联FK(因此当用户被删除时,他们的帮助也会被删除)。

但我认为这是“多重级联路径”投诉的原因。

因为如果我删除用户(当前),它将删除他们的帮助。但我试图添加一个cacade也发布,它会删除帖子,然后尝试删除该帖子的有用的(有帮助也有一个级联FK发布)。在那种情况下,SQL会选择级联FK吗?

以下是有问题的三个表的数据库图表:

enter image description here

正如你所看到的,“PostHelpful”是“Post”和“User”的孩子(两者都有FK)。

所以我不能让两个键级联?我是否需要在“用户”(AFTER DELETE)上触发以手动删除有用的(以及引用用户的其他表)。

1 个答案:

答案 0 :(得分:3)

这不是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 替换为帖子。但是在执行此操作时,最好使用触发器来删除不太独立的实体的记录。换句话说,帖子更有可能与用户 PostHelpfuls 旁边的表相关,而 PostHelpfuls 用户帖子旁边的表格。