SQLトリガーは同期ですか、非同期ですか?
-
03-07-2019 - |
質問
挿入トリガーのあるテーブルがあります。ストアドプロシージャからの1つの挿入ステートメントで6000レコードをこのテーブルに挿入すると、挿入トリガーが完了する前にストアドプロシージャが返されますか?
私が正しく考えていることを確認するために、挿入ステートメントが1つしかなかったため、トリガーは1回だけ呼び出す必要があります(「呼び出された」は正しい単語ではないことを知っています)?
主な質問は、トリガーが完了していなくてもsprocが終了するかどうかです
解決
挿入トリガーは、挿入ステートメント全体に対して1回実行されます。これが、 inserted
一時テーブルを使用して実際に挿入されたものを確認することが重要な理由であり、最新の単一レコードなどを選択するだけではありません。
挿入と更新のトリガーをテストしましたが、実際、これらはSQLサーバーによって挿入の一部と見なされます。トリガーが終了するまでプロセスは終了しません。
他のヒント
トリガーは、それらを呼び出したトランザクションの一部です。
トリガーについて注意する必要がある重要なことの1つは、トリガーがトランザクションごとに1回起動することです(少なくともSQLサーバーでは、他のデータベースを確認する必要がありますが、行ごとに処理する場合でも、通常は悪いアイデア)、したがって、6000レコードを挿入すると、トリガーは6000回ではなく1回起動します。多くの人はこのことを知らず、一度に1レコードずつ複数のレコード挿入を処理するかのようにトリガーを記述します。これは事実ではなく、トリガーは複数レコードの挿入を処理する必要があります。
トリガー呼び出しは非同期ではありません。挿入プロシージャを呼び出すたびにトリガーが起動され、トリガーが終了するまでプロシージャは戻りません。
クエリプランを見て、どのように機能するかを確認します。トリガーのステートメントは、プロシージャの呼び出しごとに呼び出されることがわかります。
問題は、TRIGGER基準が満たされるたびに、TRIGGERが起動することです。バッチ処理またはトランザクションで1回起動します。私のレッスン101 をご覧ください。トリガー
挿入行でカーソルを使用して、トリガー行を処理する必要があります。 SQL Serverのトリガーは、行ごとではなく、ステートメントごとに1回起動するためです。