2011-01-07 16 views
1

に新しいレコードを挿入するtableAにUPDATEトリガーがあります。SQL Serverのトリガー実行

CREATE TRIGGER insertIntoTableB 
ON tableA 
FOR UPDATE 
AS 
    INSERT INTO tableB (...) VALUES (...) 
GO 

次に、これらの文を順番に実行します。 2番目のUPDATE文(UPDATE tableB)は正常に動作しますか? (すなわち、テーブルAのトリガが完全に実行されるのを待つ)

UPDATE tableA 
SET ... 
WHERE key = 'some key' 

UPDATE tableB 
SET ... 
WHERE key = 'newly inserted key from trigger' 

答えて

2

挙動がnested triggersサーバ設定の対象となる、Using Nested Triggersを参照してください。トリガ が別のトリガーを開始することがアクションを実行するとき

DMLとDDLトリガーの両方が にネストされています。これらの アクションは、他のトリガー、 などを開始できます。 DMLおよびDDLトリガーは、最大32レベルまでネストされた にすることができます。 AFTERトリガーがnested triggers サーバー構成オプションによってネストされた になるかどうかを制御できます。 INSTEAD OFトリガー( INSTEAD OFトリガーのみ)は、この設定に関係なく にネストできます。

テーブルAのトリガが起動し、トリガテーブルBの内部が更新されると、テーブルBのトリガがすぐに実行されます。テーブルAトリガはではなく、で終了し、UPDATEステートメントが完了するのを待ってブロックされ、テーブルBトリガが終了するのを待ちます。ただし、テーブルAの更新は既に発生しています(通常のAFTERトリガを前提としています)。テーブルBのトリガからテーブルAをクエリすると、にアップデートが表示されます。

+0

私は最初は不明であるかもしれませんが、単一のトリガがあり、それはtableAにあるので、私はそれに応じて私の投稿を更新しました –

+1

私は参照してください。最初の更新ステートメントは、トリガーが返される前に完了しません。 2回目のUPDATEの実行が開始された時点で、発生した可能性のあるトリガーを含め、前のステートメントが完了したことを100%保証しています。 –

+0

優秀、ありがとうございます。 –

1

更新が順番にAのUPDATEトリガにコード化されている場合は、yesになります。

+0

まあ、tableAのUPDATEトリガーには、INSERT INTO tableB文が1つあり、上記のUPDATE tableA、UPDATE tableB文が順番に実行されます。 –

+0

あなたは大丈夫だと思います。最良のことは、それをテストすることです。 – diagonalbatman

+0

クールなおかげで、同様にテストされます –

関連する問題