トリガーでは、フィールドが変更されていないかどうかを確認するにはどうすればよいですか?

dba.stackexchange https://dba.stackexchange.com/questions/11896

  •  16-10-2019
  •  | 
  •  

質問

句で値が変更されたかどうかを確認しない更新ステートメントを受け取った場合、トリガー内でその更新を無視するさまざまな方法は何ですか?

個々のフィールドの比較を実行できることは知っています(iSnull側も処理します)が、50以上のフィールドがあるテーブルである場合、より速く/簡単な方法がありますか?

注:これは、監査レコードなどのIO/ノイズを減らすために使用できます...

テーブルのために:

CREATE TABLE myTest
(ID int NOT NULL IDENTITY(1,1), 
 Field1 varchar(10) NULL,
 Field2 varchar(20) NULL)

After Updaterトリガーが含まれています。

INSERT INTO myTestAudit (ID, Field1, Field2, DateTimeUpdate)
SELECT ID, Field1, Field2, getDate()
FROM inserted

初期値で:

INSERT INTO myTest (Field1, Field2)
SELECT 'a', 'b' UNION ALL
SELECT 'a', 'c'

ここで更新を実行します:

UPDATE myTest set Field2 = 'b' WHERE Field1 = 'a'
役に立ちましたか?

解決

少なくとも1つの値が変更された行を戻すには、使用できます

SELECT /*TODO: Column List*/
FROM   INSERTED I
       JOIN DELETED D
         ON I.ID = D.ID
            AND EXISTS (SELECT I.*
                        EXCEPT
                        SELECT D.*)  

他のヒント

これをトリガーの最初の行として置きます:

-- Exit trigger if no data was actually modified
IF (@@ROWCOUNT  = 0)  return

私はこれをすべての監査トリガーで行います。それは短く、ポイントまで、間違いなく無駄なi/oを削減します。

更新:申し訳ありませんが、私はあなたの質問を誤解しました。データが変更されていない場合、トリガーを終了する方法を尋ねたと思いました。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top