SQL Server 2005中的手动级联删除

时间:2011-08-08 14:59:23

标签: sql sql-server-2005

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

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

SQL Server是否提供了构建此类级联删除查询的方法?或者手动编写删除列表是唯一的选择吗?

1 个答案:

答案 0 :(得分:1)

SQL Server提供的用于帧级删除的方式是使用您说过不能使用的ON DELETE CASCADE

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

您需要在一次交易中:

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

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

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

  • 重新启用约束

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

如果可以选择使用SQL管理对象,在.NET中也可以更容易。

我应该澄清一点,我不赞同这一点,因为问题的可能性非常高。

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