SQL 删除(级联删除 vs. 触发器 vs. "Manual" -删除)



我目前正在使用SQL Server Management Studio 2005,我面临着一个小问题,但首先是我的数据库模式的摘录(重要的一个):

图像的imghack链接

我想从test表中删除它所连接的所有内容(由)。

问题是,我不能再更改数据库了(而且我真的不想更改,因为使用它的程序已经太大了)。

当我尝试删除test表中的一个条目,并且为相应的外键关系打开级联delete时,DBMS不会让我进行删除,因为它检测到某种循环(可能是由contr_tray表引起的)。

当试图通过我的程序手动删除条目时(使用SqlCommandBuildercmd.ExecuteNonQuery())),我会收到以下错误:

DELETE语句与REFERENCE约束冲突。。。

如果我使用触发器向下"级联"删除过程,也会发生同样的情况。

有人能帮我吗?非常感谢。

附言:我还试图创建一个联接表,其中属于subset表的所有列都将为NULL,而contr_tray表已联接到复制表,并让SqlCommandBuilder处理此问题,但我的SQL技能似乎达不到标准(即我没有正确理解SQL语法)[然后我也可以为我需要的所有ID获得不同的值…]

如有任何帮助,我们将不胜感激,并再次提前表示感谢。

SQL Server(令人恼火!)不支持对菱形依赖项执行级联删除。在您的情况下,Block位于"菱形"的底部,因此SQL Server无法自动向其级联父级删除。

由于您没有使用标识关系,因此您需要首先从上到下进行SELECT,以查找所有要删除的ID,然后从下到下执行实际的DELETE(以避免在该过程中违反FK)。

您应该能够将此逻辑封装在一系列INSTEAD of DELETE触发器中——您的触发器到底有什么问题?

您提供的错误与级联删除无关。它告诉您不能删除一行,因为它正被外键引用。当您没有从Test到Well的所有级联删除(包括它们之间的所有关系)时,就会发生这种情况。

如果这不是您所期望的答案,我们需要更多关于如何在每个表之间建立关系的信息。

最新更新