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

问题描述:

我正在使用SQL Server 2005,我必须将关系放入一个表中。我不得不关闭“强制外键约束”,因为我有2个关系进入同一个表。SQL Server 2005,强制实施外键约束和级联删除

但是我想把层叠删除。

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

但是,它似乎并没有这样工作,我想知道是否因为我有foriegn关键约束关闭?

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

+4

我倾向于不使用级联删除。这太危险了。相反,我更喜欢应用程序明确执行这些级联删除操作。 – 2010-06-05 01:21:16

+0

@Mitch小麦,问题在于偶尔事情是在应用程序之外完成的。另外,对于像辅助表这样的事情来说,这很有道理。 – 2010-06-05 01:23:53

+0

@nathan gonzalez我们通常不允许删除操作(仅仅是不激活行),当我们需要级联行为时,它由存储过程或表/视图上的触发器处理。我强烈建议不允许大多数登录都直接访问表,尤其是删除 - 这会在指定的数据库控制范围之外停止操作。 – 2010-06-05 02:42:48

你必须有一个fk约束来强制级联删除。 sql server如何知道要删除的内容?

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

TBH,我不能想到一种情况,我想要一个关系,但不希望它强制执行。您应该始终修复数据并强制执行关系,以免数据损坏。

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

SQL服务器将不允许多个级联路径。为了解决这个问题,将'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) 

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