初めてトリガーを使用しています。SQL Server 2005 - トリガーループ?
テーブルのフィールドを同じテーブルの更新トリガーで更新すると、このスパークがループしますか? SQL Serverはこの再帰的な振る舞いに対してガードしていますか?
おかげ
初めてトリガーを使用しています。SQL Server 2005 - トリガーループ?
テーブルのフィールドを同じテーブルの更新トリガーで更新すると、このスパークがループしますか? SQL Serverはこの再帰的な振る舞いに対してガードしていますか?
おかげ
This page(RECURSIVE_TRIGGERS
を検索)あなたはこの動作を変更するために使用できるデータベース設定のいくつかを説明します。また、手順を保護する1つの方法は、UPDATE()
ファンクションまたはCOLUMNS_UPDATED()
ファンクションのいずれかを使用することです。
たとえば、あなたが列A
、B
を持つテーブルを持っている、と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()
も便利ですが、壊れやすい(カラム名の代わりにカラムの位置に依存しています)。
トリガーの再帰は、RECURIT_TRIGGERオプションを使用してDBレベルで制御できます。デフォルトではオフになっています。このオプションがオンになっていても、トリガーのネストされたレベルの制限は32です。すべての変更は、終了条件が32レベルの制限に達する前に再帰を停止しなかった場合にロールバックされます。
+1素晴らしいリンクとその答えの例 – Sung