【发布时间】:2012-07-31 09:45:22
【问题描述】:
我有一个 UPDATE 触发器,它会生成如下所示的 INSERTED 和 DELETED 表:
插入
Id Name Surname
1 Stack Overflow
2 Luigi Saggese
已删除
Id Name Surname
1 Stacks Overflow
2 Luigi Sag
我想将此更新记录到日志表中。我的 Log 表(对所有表都是全局的)是这样的(然后我必须处理我的 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)
还有其他方法可以做到这一点吗?什么是最有效和可维护的方式?
【问题讨论】:
-
您正在使用任何特定的 DBMS? SQL Server、Oracle、MySQL、PostGreSql、SQLite?
标签: sql triggers sql-server-2012