COMMIT TRANSACTION または ROLLBACK TRANSACTION を含む DML トリガの使用
Microsoft SQL Server 2000 および SQL Server 2005 では、ステートメントの開始時にトランザクション数が 0 の場合のみ、ステートメント内のトランザクション数が増分されます。SQL Server version 7.0 では、ステートメントの開始時のトランザクション数に関係なく、ステートメント内のトランザクション数は常に増分されていました。したがって、トリガの @@TRANCOUNT が返す値は、SQL Server 2000 と SQL Server 2005 の方が 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 TRANSACTION または 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)