有没有办法可以在交易期间关闭DELETE CASCADE然后再打开?

时间:2014-08-26 05:38:31

标签: sql sql-server

我有四张桌子:考试>目标和>目标>客观主题细节。我没有在正常操作中使用DELETE CASCADE我不希望在有目标等情况下删除考试。

我创建了这个SQL来在SQL Server 2012存储过程中执行DELETE。

BEGIN
   DELETE ot
   FROM ObjectiveTopic ot
   INNER JOIN ObjectiveDetail od
    ON ot.ObjectiveDetailId = od.ObjectiveDetailId
   INNER JOIN Objective o
    ON od.ObjectiveId = o.ObjectiveId
   INNER JOIN Exam e
    ON o.ExamId = e.ExamId
   WHERE e.SubjectId = @SubjectId

   DELETE od
   FROM ObjectiveDetail od
   INNER JOIN Objective o
    ON od.ObjectiveId=o.ObjectiveId
   INNER JOIN Exam e
    On o.ExamId = e.ExamId
   Where e.SubjectId = @SubjectId;

   DELETE o
   FROM Objective o
   INNER JOIN Exam e
    ON o.ExamId = e.ExamId
   WHERE SubjectId = @SubjectId

   RETURN 0;
  END

这确实有效,但不是三次删除。有没有办法在事务中打开DELETE CASCADE,删除特定@SubjectId的所有目标,然后再次关闭DELETE CASCADE?如果没有其他方式我可以简化这个代码,或者我总是要做三次删除?

1 个答案:

答案 0 :(得分:1)

级联删除是一项性能改进。虽然它与最低子项的删除过程完全相同,但它可以提高性能(可以检查执行计划)。

所以,最好的方法是删除级联,但为此我们必须删除现有的外键,在启用ON DELETE NO ACTION设置的情况下创建一个新的外键。执行您的操作,然后完成相同的循环并再次关闭“删除CASCADE”。

考虑到这些问题,我们手头的选项是检查基础表的架构和针对它们的代码,以确保启用删除级联不会影响任何数据,然后永久地打开它。

因此,在一次交易中执行操作不是一种可行的技术。

我希望这会有所帮助。由于缺乏积分,我无法对帖子发表评论:) :)。对不起:)