2012-01-27 64 views
4

我有一个与父表(TableA)有外键关系的表(TableB)。SQL Server - 保持不带CASCADE和INSTEAD OF触发器的引用完整性

当我删除表A中的记录时,我想通过删除表B中引用TableA中的删除记录的所有记录来保持参照完整性。

通常我会删除级联。但是由于SQL Server中的表结构和针对多个级联路径的过度保护措施,对于此特定关系而言,这是不可能的。

我也不能使用INSTEAD OF触发器,因为TableA本身具有CASCADE外键关系。

我在做的是将TableA和TableB之间的关系改为ON DELETE SET NULL,然后创建一个AFTER触发器来清理TableB中的NULL记录。

有没有更好的方法来处理这种情况?

+0

你能解释一下你的意思吗?“由于表结构和针对多个层叠路径的过度保护防护措施”,并且可能包括您的表定义? – JohnFx 2012-01-27 17:22:55

+0

我明白,人们的直接想法是看设计,但我认为这不是特别不合理,在任何情况下,重组都不是一种选择。所以我只是在寻找如何解决这个问题而不需要重新设计的建议。我认为这个答案总结了我对SQL Server安全保护[级联删除导致多个级联路径]的情况和想法(http://stackoverflow.com/a/5407007/295813) – 2012-01-27 17:29:50

+1

只是好奇,什么现实世界的限制阻止你发布在子表上删除,然后在父项上删除,两者都可能包含在事务中? – 2012-01-27 17:34:00

回答

0

你能否改变另一个限制阻止你添加这个作为ON DELETE CASCADE

您可以添加一个DeleteMe列,然后发出UPDATE A SET DeleteMe = 1,然后使用after触发器先删除表B行,然后是请求的表A行?

你可以拆分或合并表(垂直,即)以某种方式分离它们的互斥依赖吗?

+0

1.我可以打破瀑布别处的路径。然而,这种关系将是我理想的地方,因为它是最不重要的。 2.这会工作,但我认为我更喜欢我的类似SET NULL解决方案。 3。我不认为这会消除多个级联路径。 – 2012-02-06 09:32:07

+0

3.项目取决于您如何将表格和多个约束的确切性质分割到同一列。所以,根据你所说的,听起来你的想法是更新为NULL。 +1是一个很好的问题。 – ErikE 2012-02-06 17:21:20

相关问题