【发布时间】:2012-02-20 16:12:17
【问题描述】:
我有一个与父表 (TableA) 有外键关系的表 (TableB)。
当我删除表 A 中的记录时,我想通过删除表 B 中所有引用表 A 中已删除记录的记录来保持引用完整性。
通常我会删除级联。但是,由于 SQL Server 中的表结构和针对多个级联路径的过度保护措施,这种特定关系是不可能的。
我也不能使用 INSTEAD OF 触发器,因为 TableA 本身具有 CASCADE 外键关系。
我正在考虑将TableA和TableB之间的关系更改为ON DELETE SET NULL,然后创建一个AFTER触发器来清理TableB中的NULL记录。
有没有更好的方法来处理这种情况?
【问题讨论】:
-
您能否解释一下您所说的“由于表结构和针对多个级联路径的过度保护措施”是什么意思,并且可能包括您的表定义?
-
我知道人们的直接想法是看设计,但我不认为这特别不合理,无论如何重组不是一种选择。所以我只是在寻找关于如何在不重新设计的情况下解决这个特定问题的建议。我认为这个答案总结了我对 SQL Server 保障cascading deletes causing multiple cascade paths 的情况和想法
-
只是好奇,现实世界中的哪些限制会阻止您在子表上执行删除操作,然后在父表上执行删除操作,而这两者可能都包含在事务中?
-
听起来你在这个级联问题上的复杂性很深。我真的建议重新设计您的表以利用内置的 SQL 功能。我只是不认为你会自制一个比平台内置更好的答案。
-
@PhilipKelley 这样做没有真正的限制,我已经考虑将其作为替代解决方案。但是,如果我可以让数据库在有人可能直接修改数据(不太可能但可能)的情况下强制执行 RI,那将是可取的。
标签: sql-server triggers cascade referential-integrity