使用包含 COMMIT 或 ROLLBACK TRANSACTION 的 DML 触发器
在 Microsoft SQL Server 2000 和 SQL Server 2005 中,事务计数仅当语句开始时事务计数为 0 的情况下在才会在语句中增加。在 SQL Server 7.0 中,无论语句开始时的事务计数如何,事务计数都会增加。与在 SQL Server 7.0 中相比,在 SQL Server 2000 和 SQL Server 2005 中,TRANCOUNT 在触发器中返回的值可能更小。
在 SQL Server 2000 和 SQL Server 2005 中,如果在触发器中执行 COMMIT TRANSACTION 或 COMMIT WORK 语句,并且在触发器启动时没有对应的显式或隐式 BEGIN TRANSACTION 语句,则用户可能会看到不同于 SQL Server 7.0 中的行为。建议不要将 COMMIT TRANSACTION 或 COMMIT WORK 语句放置在触发器中。
当包含 ROLLBACK TRANSACTION 语句的触发器在批处理中执行时,它们会取消整个批处理。在 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.
请参阅
概念
其他资源
ROLLBACK TRANSACTION (Transact-SQL)