次のようなINSERTEDテーブルとDELETEDテーブルを生成するUPDATEトリガーがあります。
挿入
Id Name Surname
1 Stack Overflow
2 Luigi Saggese
削除済み
Id Name Surname
1 Stacks Overflow
2 Luigi Sag
この更新をログテーブルにキャプチャしたいと思います。私のログテーブル(すべてのテーブルに対してグローバル)は次のようになります(次に、INSERTEDテーブルとDELETEDテーブルを処理する必要があります)。
Id_Table Table_Key_Value Id_Value Old_Value New_Value
12345 1 4556645 Stack Stacks
12345 1 544589 Overflow Overflows
12345 2 544589 Saggese Sag
Id_Table
は、UPDATEステートメントを実行したテーブルのシステムobject_idであり、UPDATEされたTable_Key_Value is
列の主キーの値は、Id_Value
各テーブルの各列にマップしたカスタムIDです。列のデータは、列がUPDATEによって変更された場合にのみログに記録されます。
私はこれを行う2つの方法を考えました:
列ごとに1回、テーブルでSELECTを実行します。
INSERT INTO LOG (Id_Table, Table_Key_Value, Id_Value,Old_Value, New_Value) SELECT 12345, Id, 4556645, D.Name, I.Name FROM INSERTED I INNER JOIN DELETED D ON I.ID = D.ID WHERE D.Name <> I.Name union SELECT 12345, Id, 544589, D.Surname, I.Surname FROM INSERTED I INNER JOIN DELETED D ON I.ID = D.ID WHERE D.Surname <> I.Surname
UDFに対して単一選択を実行する:
SELECT CustomFunction(12345,Id, I.Name, D.Name, I.Surname, D.Surname) FROM INSERTED I INNER JOIN DELETED D ON I.ID = D.ID **CustomFunction** (_Id_Table,_Table_Key_Value, _Old_Value_Name, _New_Value_Name, _Old_Value_Surname, _New_Value_Surname) INSERT INTO LOG(Id_Table, Table_Key_Value, Id_Value,Old_Value, New_Value) VALUES(_Id_Table,_Table_Key_Value, 4556645, _Old_Value_Name, _New_Value_Name) INSERT INTO LOG(Id_Table, Table_Key_Value, Id_Value,Old_Value, New_Value) VALUES(_Id_Table,_Table_Key_Value, 544589, _Old_Value_Surname, _New_Value_Surname)
これを行う他の方法はありますか?最も効率的で保守可能な方法は何ですか?