共用方式為


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

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

在 SQL Server 2000 與 SQL Server 2005 中,如果觸發程序中執行 COMMIT TRANSACTION 或 COMMIT WORK 陳述式,且該程序的開頭沒有對應的外顯或隱含 BEGIN TRANSACTION 陳述式時,其行為可能不同於 SQL Server 7.0 版。我們不建議在觸發程序中放置 COMMIT TRANSACTION 或 COMMIT WORK 陳述式。

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

請參閱

概念

預存程序和觸發程序中的回復與認可
交易 (Database Engine)

其他資源

ROLLBACK TRANSACTION (Transact-SQL)

說明及資訊

取得 SQL Server 2005 協助