3

SQLServerで行が変更されたかどうかを検出するトリガーを作成したいと思います。私の現在のアプローチは、各フィールドをループし、COLUMNS_UPDATED()を適用してUPDATEが呼び出されたかどうかを検出し、最後に、挿入と削除の同じ行(PKで識別)のこのフィールドの値を比較することです。

手順からループを排除したい。おそらく、挿入および削除されたコンテンツを1つのテーブルにダンプし、すべての列でグループ化し、count=2の行を取得することができます。これらの行は変更されていないものとしてカウントされます。

最終目標は、監査証跡を作成することです。1)ユーザーとタイムスタンプを追跡します。2)挿入、削除、および実際の変更を追跡します。

任意の提案をいただければ幸いです。

4

1 に答える 1

5

ループする代わりに、BINARY_CHECKSUMを使用して、挿入されたテーブルと削除されたテーブルの間で行全体を比較し、それに応じて動作させることができます。

Create table SomeTable(id int, value varchar(100))

Create table SomeAudit(id int, Oldvalue varchar(100), NewValue varchar(100))


Create trigger tr_SomTrigger  on SomeTable for Update 
as
begin
        insert into SomeAudit 
        (Id, OldValue, NewValue)
        select i.Id, d.Value, i.Value 
        from
        (
            Select Id, Value, Binary_CheckSum(*) Version from Inserted
        ) i
        inner join 
        (
            Select Id, Value, Binary_CheckSum(*) Version from Deleted
        ) d
        on i.Id = d.Id and i.Version <> d.Version


End 

Insert into sometable values (1, 'this')
Update SomeTable set Value = 'That'
Select * from SomeAudit
于 2012-09-05T17:00:43.730 に答える