使用包含 COMMIT 或 ROLLBACK TRANSACTION 的 DML 觸發程序

在 SQL Server 7.0 版之後發行的 SQL Server 更新版本中,只有當陳述式開頭的交易計數為 0 時,才會遞增陳述式中的交易計數。在 SQL Server 7.0 版中,不論陳述式開頭的交易計數為何,都會遞增交易計數。因此,在更新版本中觸發程序內 @@TRANCOUNT 傳回的值可能小於在 SQL Server 7.0 中觸發程序內傳回的值。

在更新的版本中,如果在觸發程序內執行 COMMIT TRANSACTION 或 COMMIT WORK 陳述式,且觸發程序開頭沒有對應的明確或隱含的 BEGIN TRANSACTION 陳述式,使用者可能會見到不同於 SQL Server 7.0 版中的行為。我們不建議在觸發程序中放置 COMMIT TRANSACTION 或 COMMIT WORK 陳述式。

當觸發程序包含 COMMIT 或 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.