用于删除表层次结构的触发器/约束

时间:2017-02-22 15:06:49

标签: sql-server triggers sql-server-2012 cascading-deletes

我有以下表结构,它存储了我的应用程序的一些结果。每个层次结构级别都附加了一个数据行,该行再次由多个值组成。数据行专门分配给层次结构表的单个表,而不是并行多个。我的目标是删除Parent,包括所有层次结构级别,数据和值。

Hierarchical Structure

我的第一次尝试是在任何地方添加ON DELETE CASCADE约束,但ON DELETE CASCADE不适用于菱形结构。结果是:

Introducing FOREIGN KEY constraint 'FK_Data_Hierarchy2' on table 'Data' may cause cycles or cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other KEY constraints.

然后我的第二次尝试是删除Data表上的级联约束,并向Hierarchy 1-3添加INSTEAD OF DELETE触发器,删除自己行之前的Data条目。但是在那里SQL Server抱怨你不能添加这样的触发器,因为层次结构嵌套有ON DELETE CASCADE

Cannot create INSTEAD OF DELETE or INSTEAD OF UPDATE TRIGGER 'TR_Hierarchy1_Delete' on table 'dbo.Hierarchy'. This is  because the table has a FOREIGN KEY with cascading DELETE or UPDATE.

我的最后一个计划是删除所有ON DELETE CASCADE约束并在触发器中手动删除整个树。但这是一个挑战,以优化的方式做到这一点。

  • 这项工作的最佳解决方案是什么?使用游标迭代行? (由于迭代可能很慢)
  • 使用组合联接为每个表选择受影响的行? (由于冗余加入整个层次结构可能很慢)
  • 或者有人知道如何使用结果集删除多个表吗?

0 个答案:

没有答案