SQLServer2005中的手动级联删除

SQLServer2005中的手动级联删除,sql,sql-server-2005,Sql,Sql Server 2005,我正在编写一个SSIS包,在SQL任务中,我必须从表中删除一条记录。此记录链接到一些表,这些相关表可能与其他一些表相关。因此,当我试图删除一条记录时,我应该首先删除其他表中对它的所有引用 我知道设置级联删除是实现这一点的最佳选择。但是,它是一个遗留数据库,不允许进行此更改。此外,它是一个事务数据库,应该避免从应用程序中意外删除 SQL Server是否提供了任何方法来构建这种级联删除查询?或者手动写入删除列表是唯一的选择?SQL Server提供的帧级联删除的方法是在删除级联上使用,您已经说过不

我正在编写一个SSIS包,在SQL任务中,我必须从表中删除一条记录。此记录链接到一些表,这些相关表可能与其他一些表相关。因此,当我试图删除一条记录时,我应该首先删除其他表中对它的所有引用

我知道设置级联删除是实现这一点的最佳选择。但是,它是一个遗留数据库,不允许进行此更改。此外,它是一个事务数据库,应该避免从应用程序中意外删除


SQL Server是否提供了任何方法来构建这种级联删除查询?或者手动写入删除列表是唯一的选择?

SQL Server提供的帧级联删除的方法是在删除级联上使用
,您已经说过不能使用该方法

可以通过查询元数据来获取其他表中受影响记录的列表,但这会很复杂,因为您希望在删除之前删除约束(以及元数据引用)

在单个交易中,您需要:

  • 查询元数据以获取受影响表的列表这需要是递归的,这样才能得到受第一层影响的表,然后是受第一层影响的表,依此类推。

  • 删除约束出于与上述相同的原因,这也需要是递归的。

  • 删除所有受影响表中的记录

  • 重新启用约束

其他人可能有一个更优雅的解决方案,但我认为这可能就是它

如果可以的话,在.NET中使用SQL管理对象也会更容易

我也应该澄清,我不支持这一点,因为潜在的问题非常多。


我认为您最安全的做法是手动写出删除内容。

我一直建议不要使用“删除级联”,原因很明显。您是否可以将记录标记为“已删除”而不是“硬”删除?@Mitch…不够明显(无论如何,对我来说)。在删除级联时应该避免的原因是什么…只是意外删除行的意外后果,还是您避免它的其他原因?我自己发现它非常有用。如果我进行递归删除,那么删除和重新创建约束的必要性是什么。删除约束将覆盖右侧约束设置的规则。在你的建议中,我们从一页到另一页都尊重这些限制。但是你提供的信息确实对我有帮助。谢谢您的回复。@Sarav-如果您保留约束,则需要确保在递归查询中使用相反的顺序。如果你放弃约束,顺序就无关紧要了。