我有一个 UPDATE 触发器,它会生成如下所示的 INSERTED 和 DELETED 表:
已插入
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,Table_Key_Value is
UPDATEd 列的主键的值,Id_Value
是我映射到每个表中的每个列的自定义 ID。仅当列被 UPDATE 更改时,才会记录列的数据。
我想到了两种方法来做到这一点:
对表执行 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)
还有其他方法可以做到这一点吗?什么是最有效和可维护的方式?