【问题标题】:Trigger - is it necessary BEGIN / COMMIT TRAN触发器 - 是否有必要 BEGIN / COMMIT TRAN
【发布时间】:2015-06-24 20:42:39
【问题描述】:

我想像这样制作 INSTEAD OF 触发器:

CREATE TRIGGER [dbo].[DeleteCompany]
ON [dbo].[Company]
 INSTEAD OF DELETE
  AS 
  DECLARE @CompanyID int
  SELECT @CompanyID = deleted.CompanyID FROM deleted

  BEGIN TRAN
  DELETE FROM Project WHERE CompanyID = @CompanyID
  DELETE FROM CompanyPerson WHERE CompanyID = @CompanyID
  UPDATE PersonCompany SET CompanyID = null WHERE CompanyID = @CompanyID

  DELETE [Company]
     FROM DELETED D
     INNER JOIN [Company] T ON T.CompanyID = D.CompanyID
  COMMIT TRAN

所以,我可以肯定,这些动作是一种原子动作。但这有意义还是 TRIGGER 总是在事务内部执行?

另外,如果公司将在另一个 TRIGGER 中被删除,会发生什么情况:

CREATE TRIGGER [dbo].[DeleteSecurityLevel]
ON [dbo].[SecurityLevel]
 INSTEAD OF DELETE
  AS 
  DECLARE @SecurityLevelID int
  SELECT @SecurityLevelID = deleted.SecurityLevelID FROM deleted

  BEGIN TRAN
  DELETE FROM Company WHERE SecurityLevelId = @SecurityLevelID
  DELETE FROM CompanyRole WHERE SecurityLevelId = @SecurityLevelID
  ....

  DELETE SecurityLevel
     FROM DELETED D
     INNER JOIN SecurityLevel T ON T.SecurityLevelID = D.SecurityLevelID
  COMMIT TRAN

所以,触发器 DeleteSecurityLevel 正在删除 Company 并调用 DeleteCompany 触发器。如果每个触发器都有 BEGIN/COMMIT TRAM ,它将在一个事务中?如果每个触发器都没有?

PS。我无法设置“CASCADE DELETE”,因为 DB 有一些类似的关系:

所以,尝试设置 CASCADE DELETE 会抛出类似的错误:

在表上引入 FOREIGN KEY 约束“FK_Persons_Areas” “人”可能会导致循环或多个级联路径。指定开 DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束或索引。见上 错误。

【问题讨论】:

    标签: sql-server triggers azure-sql-database sql-server-2014


    【解决方案1】:

    所有 DML 语句都在事务中执行。触发器中的 DML 将使用触发触发器的语句的事务上下文,因此触发器内部和外部的所有修改都是单个原子操作。

    【讨论】:

      【解决方案2】:

      您不需要触发器内的显式事务,它们共享相同的事务工作区和触发器内的批处理以及调用它的操作一起提交或一起回滚

      【讨论】:

        【解决方案3】:

        触发器总是在事务的上下文中执行 - 每个 DML 语句都在事务中运行。由于在 SQL Server 中将隐式事务设置为自动提交,因此这通常是隐藏的。 如果您从触发器内发出回滚,这将(与回滚一样)回滚所有事务,无论是否嵌套。 通常,您不会在触发器中提交,除非(如您在注释掉的示例中)您明确打开嵌套事务。 如果您的问题还有其他方面,我无法从您发布的示例中弄清楚它们是什么。虽然我一直很喜欢人们在提出 SQL 问题时发布实际 SQL,但有时一些评论或实际问题的要点列表会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-31
          • 1970-01-01
          • 1970-01-01
          • 2016-02-14
          • 2012-08-11
          相关资源
          最近更新 更多