挿入トリガーを持つテーブルがあります。ストアド プロシージャからの 1 つの挿入ステートメントでこのテーブルに 6000 レコードを挿入すると、ストアド プロシージャは挿入トリガーが完了する前に戻りますか?
私の考えが正しいことを確認するために、insert ステートメントは 1 つしかないため、トリガーは 1 回だけ呼び出す必要があります (「呼び出された」という言葉が適切ではないことはわかっています)。
私の主な質問は: トリガーが完了していなくても、sproc は終了しますか?
挿入トリガーを持つテーブルがあります。ストアド プロシージャからの 1 つの挿入ステートメントでこのテーブルに 6000 レコードを挿入すると、ストアド プロシージャは挿入トリガーが完了する前に戻りますか?
私の考えが正しいことを確認するために、insert ステートメントは 1 つしかないため、トリガーは 1 回だけ呼び出す必要があります (「呼び出された」という言葉が適切ではないことはわかっています)。
私の主な質問は: トリガーが完了していなくても、sproc は終了しますか?
挿入トリガーは、挿入ステートメント全体に対して 1 回実行されます。これが、inserted
一時テーブルを使用して実際に挿入されたものを確認することが重要であり、最新の単一レコードなどを選択するだけではない理由です。
挿入トリガーと更新トリガーをテストしたところ、実際、それらはSQLサーバーによる挿入の一部と見なされます。トリガーが終了するまでプロセスは終了しません。
Triggers are part of the transaction that called them.
One important thing about triggers that you must be aware of is that the trigger fires once for each transaction (at least in SQL server, you should check other dbs, but even if it will process row by row, that is usually a poor idea), so if you insert 6000 records the trigger fires once not 6000 times. Many people are not aware of this and write triggers as if they will process multiple record inserts one record at a time. This is not true and your trigger must account for handing the multiple record insert.
トリガー呼び出しは非同期ではありません。挿入プロシージャを呼び出すたびにトリガーが起動され、トリガーが終了するまでプロシージャは戻りません。
クエリ プランを見て、その仕組みを確認してください。トリガー内のステートメントが、プロシージャーの呼び出しごとに呼び出されることがわかります。
問題は、TRIGGER 基準が満たされるたびに、TRIGGER が起動することです。バッチ処理またはトランザクションで 1 回発火します。TRIGGERの私のレッスン 101を参照してください。
トリガー行を処理するには、挿入ステートメントでカーソルを使用する必要があります。SQL Server のトリガーは、行ごとではなく、ステートメントごとに 1 回起動するためです。