C# SQL删除(级联删除vs.触发器vs.手动删除)
我目前正在使用SQL Server Management Studio 2005,我面临着一些问题,但首先是我的DB模式的摘录(重要的一个): 我想从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
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你将无法使用删除后触发器,正如你已经指出的那样。取而代之的是当然,删除是一条路要走。