web-dev-qa-db-ja.com

トランザクションと組み合わせたトリガー

次のような状況があるとします。

テーブル(Table_Aとしましょう)があり、INSERTにトリガーがあります。トリガージョブは、table_Bに挿入された値に基づいて、table_Aの一部の行を更新することです。

テーブルに行を挿入するだけで問題はありませんが、トランザクションを通じてデータを挿入する場合はどうでしょうか。トリガーは、すべてのトランザクションステートメントが正常に実行されるまで待機しますか、それとも挿入を認識したときにトリガーされますか?トリガーが最初の挿入を認識するとすぐに起動する場合、トランザクションが最後の行で失敗するとどうなりますか?その状況に何らかのメカニズムはありますか?.

25
veljasije

挿入は、トランザクション内で常にです。

明示的なBEGIN TRAN ... COMMITまたは SET IMPLICIT_TRANSACTIONS ON がない場合、ステートメントは自己完結型 自動コミットトランザクション として実行されます。

トリガーは常に、トリガーを起動するアクションのトランザクションの一部です。トリガーでエラーが発生してトランザクションのロールバックが発生した場合、起動アクションもロールバックされます。

トリガーは暗黙的に XACT_ABORT をオンにします。この設定がオンのエラーは、トランザクションのロールバックに自動的につながります(RAISERRORステートメントを使用したコードで発生したエラーを除く)。

38
Martin Smith