次のような状況があるとします。
テーブル(Table_A
としましょう)があり、INSERT
にトリガーがあります。トリガージョブは、table_B
に挿入された値に基づいて、table_A
の一部の行を更新することです。
テーブルに行を挿入するだけで問題はありませんが、トランザクションを通じてデータを挿入する場合はどうでしょうか。トリガーは、すべてのトランザクションステートメントが正常に実行されるまで待機しますか、それとも挿入を認識したときにトリガーされますか?トリガーが最初の挿入を認識するとすぐに起動する場合、トランザクションが最後の行で失敗するとどうなりますか?その状況に何らかのメカニズムはありますか?.
挿入は、トランザクション内で常にです。
明示的なBEGIN TRAN ... COMMIT
または SET IMPLICIT_TRANSACTIONS ON
がない場合、ステートメントは自己完結型 自動コミットトランザクション として実行されます。
トリガーは常に、トリガーを起動するアクションのトランザクションの一部です。トリガーでエラーが発生してトランザクションのロールバックが発生した場合、起動アクションもロールバックされます。
トリガーは暗黙的に XACT_ABORT
をオンにします。この設定がオンのエラーは、トランザクションのロールバックに自動的につながります(RAISERROR
ステートメントを使用したコードで発生したエラーを除く)。