2009-04-03 17 views
2

初めてトリガーを使用しています。SQL Server 2005 - トリガーループ?

テーブルのフィールドを同じテーブルの更新トリガーで更新すると、このスパークがループしますか? SQL Serverはこの再帰的な振る舞いに対してガードしていますか?

おかげ

答えて

3

This pageRECURSIVE_TRIGGERSを検索)あなたはこの動作を変更するために使用できるデータベース設定のいくつかを説明します。また、手順を保護する1つの方法は、UPDATE()ファンクションまたはCOLUMNS_UPDATED()ファンクションのいずれかを使用することです。

たとえば、あなたが列ABを持つテーブルを持っている、とC、そしてあなたがCの値が列Bの値が更新されたとき、あなたはトリガーでコールを保護することができます自動的に変更する、場合:

CREATE TRIGGER Whatever ON TableName AFTER UPDATE 
AS 
BEGIN 
    IF UPDATE(B) 
    BEGIN 
     /* Update column C here */ 
    END 
END 

あなたが列Cがあなたのトリガーによって更新されたときに、再帰的トリガーを呼び出さないようにこの方法です。 COLUMNS_UPDATED()も便利ですが、壊れやすい(カラム名の代わりにカラムの位置に依存しています)。

+0

+1素晴らしいリンクとその答えの例 – Sung

1

トリガーの再帰は、RECURIT_TRIGGERオプションを使用してDBレベルで制御できます。デフォルトではオフになっています。このオプションがオンになっていても、トリガーのネストされたレベルの制限は32です。すべての変更は、終了条件が32レベルの制限に達する前に再帰を停止しなかった場合にロールバックされます。