SQL Server 2005,实施外键约束和级联删除

时间:2010-06-05 01:18:07

标签: sql sql-server sql-server-2005

我使用的是SQL Server 2005,我必须将关系放到一个表中。我不得不关闭“强制外键约束”,因为我有2个关系进入同一个表。

但是我想把cascade删除。

我想如果我对这两个关系都有级联删除,如果我说从这些表中删除了某些东西,它会级联并删除到另一个表中。

然而它似乎没有那样工作,我想知道是因为我关闭了foriegn键约束?

如果是这种情况,我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

你必须有一个fk约束来强制执行级联删除。 sql server怎么知道删除什么呢?

答案 1 :(得分:2)

我不清楚你为什么需要首先禁用外键约束。您可以与同一个表具有许多关系,这些关系都强制实施参照完整性。但是,如果在同一子表中有两个与同一父表的关系,则只能在其中一个子表上启用级联更新或级联删除。

TBH,我想不出我希望建立关系但不希望强制执行的情况。您应该始终修复数据并强制执行关系,以便数据不会被破坏。

这实际上是通过存储过程对数据访问进行漏洞化帮助的情况。如果您强迫人们仅通过存储过程进行删除,则可以在过程中强制执行级联删除,而无需在DRI中强制执行。

答案 2 :(得分:2)

SQL Server不允许多个级联路径。要解决此问题,请为每个附加路径添加“FOR DELETE”触发器。

ALTER TRIGGER [dbo].[trgMyTriggerName] ON [dbo].[tblMyTable] FOR DELETE AS
SET NOCOUNT ON
DELETE FROM tblMySubTable
WHERE MySubTable_Parent_ID IN (SELECT MyTable_ID FROM deleted)

您仍然需要添加外键,只需将“强制外键约束”设置为“否”,并使“删除规则”和“更新规则”不执行任何操作。这允许您使用外键的所有优点(智能感知,实体框架等)。