Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL删除(级联删除vs.触发器vs.手动删除)_C#_Sql_Sql Server 2005_Cascading Deletes - Fatal编程技术网

C# SQL删除(级联删除vs.触发器vs.手动删除)

C# SQL删除(级联删除vs.触发器vs.手动删除),c#,sql,sql-server-2005,cascading-deletes,C#,Sql,Sql Server 2005,Cascading Deletes,我目前正在使用SQL Server Management Studio 2005,我面临着一些问题,但首先是我的DB模式的摘录(重要的一个): 我想从test表中删除它所连接的所有内容(包括) 问题是,我不能再修改DB了(而且我真的不想,因为使用它的程序已经太大了) 当我尝试删除test表中的一个条目,并且为相应的外键关系启用了级联删除时,DBMS不允许我执行删除操作,因为它检测到某种循环(可能是由控制盘表引起的) 当尝试通过我的程序手动删除条目时(使用SqlCommandBuilder或cm

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

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

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

当我尝试删除
test
表中的一个条目,并且为相应的外键关系启用了级联删除时,DBMS不允许我执行删除操作,因为它检测到某种循环(可能是由
控制盘
表引起的)

当尝试通过我的程序手动删除条目时(使用
SqlCommandBuilder
cmd.ExecuteNonQuery())
我遇到以下错误:

DELETE语句与引用约束冲突

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

有人能帮我吗?谢谢大家!

S.S.:我也尝试创建一个连接表,其中所有属于“代码>子集< /Cord>表的列将是空的,其中<代码>对照盘表已经连接到复制表,并让<代码> SqlCommandBuilder <代码>处理这个问题,但是我的SQL技巧似乎没有达到标准(即我没有得到SQL语法正确)。[然后我还可以获得我需要的所有ID的不同值…]


感谢您提供的任何帮助。

您提供的错误与级联删除无关。它告诉您不能删除某一行,因为该行正被外键引用。如果您没有从测试到测试的所有级联删除过程(包括其间的所有关系),则会发生这种情况n

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

SQL Server(令人烦恼的!)不支持对菱形依赖项进行级联删除。在您的情况下,
块位于“菱形”的底部因此,SQL Server无法自动将父项删除级联到它

由于您没有使用标识关系,因此需要首先选择自上而下查找所有要删除的ID,然后执行实际的删除自底向上(以避免在此过程中违反FKs)


您应该能够将此逻辑封装在一系列的而不是删除触发器中-您的触发器到底有什么问题?

是的,您是对的。如果我将所有内容都设置为级联删除(在所有外键关系中),则会出现不同的错误。如果我尝试在“FK_块控制托盘”中设置级联删除(即,编辑模式后保存模式)DBMS告诉我类似这样的信息(经过精心翻译):''block'表插入外键约束'FK_block_contr_tray1'可能导致循环或多个级联路径'我刚刚使用了正常的
删除后触发器来模拟级联效果,但是我当然得到了
删除语句与引用约束冲突的错误消息…
但是你的方法看起来很有希望。我明天会试用。@Rufus你将无法使用删除后触发器,正如你已经指出的那样。取而代之的是当然,删除是一条路要走。