SQL DELETE(级联DELETE与TRIGGERS对比“手动”-DELETE)

时间:2012-07-18 16:09:35

标签: c# sql sql-server-2005 cascading-deletes

我目前正在使用SQL Server Management Studio 2005,我遇到了一些问题,但首先是我的数据库架构的摘录(重要的一个):

imghack link to the image

我想从test表及其连接的所有内容中删除(由...组成)。

问题是,我不能再改变数据库了(真的不想这样,导致使用它的程序已经太大了)。

当我尝试删除test表中的条目并为相应的外键关系启用级联DELETE时,DBMS将不允许我执行删除操作,因为它检测到某种循环(可能由contr_tray表引起。

尝试通过我的程序手动删除条目时(使用SqlCommandBuildercmd.ExecuteNonQuery())我收到此错误:

  

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

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

有人可以帮我吗?谢谢!

PS:我还尝试创建一个连接表,其中属于subset表的所有列都只是NULL,其中contr_tray表已连接到复制表并让{{1处理这个,但我的SQL技能似乎没有达到标准(即我没有得到正确的SQL语法)[然后我也可以得到我需要的所有ID的不同值...]

任何帮助将不胜感激,并再次感谢。

2 个答案:

答案 0 :(得分:1)

SQL Server(令人讨厌!)不支持菱形依赖项上的ON CASCADE DELETE。在您的情况下,Block位于“菱形”的底部,因此SQL Server无法自动将父删除级联到它。

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

您应该能够将此逻辑封装在一系列INSTEAD OF DELETE触发器中 - 您的触发器究竟出现了什么问题?

答案 1 :(得分:0)

您提供的错误与级联删除无关。它告诉您无法删除行,因为它被外键引用。如果您没有从Test到Well的级联删除,包括之间的所有关系,就会发生这种情况。

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