我使用的是SQL Server 2005,我必须将关系放到一个表中。我不得不关闭“强制外键约束”,因为我有2个关系进入同一个表。
但是我想把cascade删除。
我想如果我对这两个关系都有级联删除,如果我说从这些表中删除了某些东西,它会级联并删除到另一个表中。
然而它似乎没有那样工作,我想知道是因为我关闭了foriegn键约束?
如果是这种情况,我该如何解决这个问题?
答案 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)
您仍然需要添加外键,只需将“强制外键约束”设置为“否”,并使“删除规则”和“更新规则”不执行任何操作。这允许您使用外键的所有优点(智能感知,实体框架等)。