COMMIT TRANSACTION または ROLLBACK TRANSACTION を含む DML トリガの使用

SQL Server version 7.0 より後の SQL Server のリリースでは、ステートメントの開始時点でトランザクションが 0 の場合のみ、ステートメント内のトランザクション数が増分します。SQL Server version 7.0 では、ステートメントの開始時のトランザクション数に関係なく、ステートメント内のトランザクション数は常に増分されていました。したがって、トリガの @@TRANCOUNT が返す値は、後のリリースの方が SQL Server 7.0 よりも小さくなる可能性があります。

最近のリリースでは、COMMIT TRANSACTION または COMMIT WORK ステートメントがトリガ内で実行される場合、トリガの開始時に、対応する明示的または暗黙的な BEGIN TRANSACTION ステートメントがないと、SQL Server version 7.0 とは異なる動作が実行される場合があります。COMMIT TRANSACTION または COMMIT WORK ステートメントをトリガに含めることはお勧めしません。

COMMIT TRANSACTION または 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.