5

我有用户邮政之间的1 .. *关系。 (一个用户有很多文章)SQL Server 2008 - 多级联FK - 我需要一个触发器吗?

邮政有一个FK称为“用户ID”,其映射到“用户ID”字段上用户表。

我试图设置此FK作为级联更新/删除,但我得到这个错误:

'Users' table saved successfully 'Posts' table - Unable to create relationship 'FK_Posts_Users'.
Introducing FOREIGN KEY constraint 'FK_Posts_Users' on table 'Posts' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

我有一个表叫PostHelpful。一篇文章有​​很多有用的。

有帮助有一个级联FK用户(所以当一个用户被删除,他们的帮助也被删除)。

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

因为如果我删除了一个用户(当前),它会删除他们的帮助。但即时通讯试图添加一个cacade邮政也,它会删除邮政,然后尝试删除有用的邮件(作为有帮助也有级联FK邮政)。在这种情况下,SQL选择哪个级联FK?

这里是有问题的三个表的数据库图表:

enter image description here

正如你所看到的,“PostHelpful”是孩子既有“邮报”和“用户”(具有FK的既)。

所以我不能让两个键级联?我是否需要“用户”(AFTER DELETE)上的触发器来手动删除帮助文件(和其他引用用户的表)。

+0

您已经发现问题以及如何解决问题。删除User和PostHelpful之间的级联删除,在PostHelpful中添加一个触发器给用户'on delete'删除。那么你应该可以在User和Post之间添加级联删除。 – 2011-02-24 09:48:15

+0

@Mikael Eriksson - 真的吗?我的意思是它会工作,但我希望这是做错事情的错误方式。触发器不应该强制引用完整性。 – RPM1984 2011-02-24 11:05:47

+0

嗯。从未将级联删除视为参照完整性约束的一部分。更像是一种处理删除的便捷方式。我可能不会使用触发器或级联删除。我会编写一个按正确顺序删除的存储过程。 – 2011-02-24 11:12:32

回答

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约束。

您可以将后帮助职位在上述步骤。但是,当这样做时,最好使用触发器来删除不那么独立的实体记录。换句话说,它更可能是帖子都涉及到表用户PostHelpfulsPostHelpfuls有关表格用户帖子旁边的旁边。

+0

好吧,这就是我的想法。所以我现在有三个人说同样的事情。该死的,好的 - 欢呼声。 – RPM1984 2011-03-03 22:32:03