使用包含 COMMIT 或 ROLLBACK TRANSACTION 的 DML 触发器

在 SQL Server 7.0 版之后的 SQL Server 版本中,仅当事务计数在语句开始时为 0 时,才会在语句中增加事务计数。在 SQL Server 7.0 中,无论语句开始时的事务计数如何,事务计数都会增加。因此,与 SQL Server 7.0 中相比,更高版本中的 @@TRANCOUNT 在触发器中返回的值可能更小。

在更高版本中,如果在触发器中执行 COMMIT TRANSACTION 或 COMMIT WORK 语句,并且在触发器的开始位置没有对应的显式或隐式 BEGIN TRANSACTION 语句,则用户看到的行为可能与在 SQL Server 7.0 版中看到的行为有所不同。建议不要将 COMMIT TRANSACTION 或 COMMIT WORK 语句放置在触发器中。

当包含 ROLLBACK TRANSACTION 语句的触发器在批处理中执行时,它们会取消整个批处理。在 SQL Server 2008 和 SQL Server 2005 中,也会返回错误。

在以下示例中,如果 INSERT 语句触发了包含 ROLLBACK TRANSACTION 的 DML 触发器,则 DELETE 语句将由于批处理被取消而无法执行:

/* Start of Batch */
INSERT employee VALUES ('XYZ12345M', 'New', 'M', 'Employee', 1, 1, '9952', '6/1/95') -- Causes trigger to fire and ROLLBACK TRANSACTION.
DELETE employee WHERE emp_id = 'PMA42628M'
GO

如果在用户定义的事务中触发包含 ROLLBACK TRANSACTION 语句的触发器,则 ROLLBACK TRANSACTION 将回滚整个事务。在以下示例中,如果 INSERT 语句触发了包含 ROLLBACK TRANSACTION 的触发器,则 UPDATE 语句也将回滚:

/* Start of Transaction */
BEGIN TRANSACTION
UPDATE employee SET hire_date = '7/1/94' WHERE emp_id = 'VPA30890F'
INSERT employee VALUES ('XYZ12345M', 'New', 'M', 'Employee', 1, 1, '9952', '6/1/95') -- Causes trigger to fire and ROLLBACK TRANSACTION.