興味深い問題です。デフォルトでは、トリガーは、失敗した場合、それを起動したコマンドをロールバックするように設計されています。したがって、トリガーが実行されているときはいつでも、明示的な BEGIN TRANSACTION があったかどうかに関係なく、アクティブなトランザクションがあります。また、トリガー内の BEGIN/TRY も機能しません。失敗する可能性のあるコードをトリガーに記述しないことをお勧めします - 実行ステートメントも失敗させたい場合を除きます。
この状況では、この動作を抑制するために、いくつかの回避策があります。
オプション A (醜い方法):
トランザクションはトリガーの開始時にアクティブであるため、COMMIT
そのままトリガー コマンドを続行できます。
CREATE TRIGGER tgTest1 ON Test1 AFTER INSERT
AS
BEGIN
COMMIT;
... do whatever trigger does
END;
トリガー コードにエラーがある場合でもエラー メッセージが生成されますが、Test1
テーブル内のデータは安全に挿入されることに注意してください。
オプションB(これも醜い):
コードをトリガーからストアド プロシージャに移動できます。次に、実装する Wrapper SP からそのストアド プロシージャをBEGIN/TRY
呼び出し、最後にトリガーから Wrapper SP を呼び出します。これは、ロジック(現在SPにある)で必要な場合にテーブルからデータを移動するのが少し難しいかもしれませんINSERTED
-おそらくいくつかの一時テーブルを使用しています。
SQLFiddle デモ