【发布时间】:2021-08-04 06:28:23
【问题描述】:
给定一个带有 ID 的简单表,审计正在更改的列的正确方法是什么。我在照顾各种似乎不起作用的答案后问。
这是我所拥有的:
Create Table Tbl_Audit
(
AuditId int identity(1,1) not null,
Tbl_Id int not null.
Tbl_Old_ColumnValue varchar(255),
Tbl_New_ColumnValue varchar(255)
)
GO
Create Trigger Tr_Tbl_ColumnChanged on Tbl
after insert, update
As
begin
if(update(ColumnName))
begin
insert into tbl_audit
(
Tbl_Id,
Tbl_Old_ColumnName,
Tbl_New_ColumnName
)
select
tbl.PKId,
tbl.ColumnName,
i.ColumnName,
from
Tbl tbl join
inserted i
on tbl.PKId = i.PKId
end
我看到的是数千个例子,Tbl_Old_ColumnValue = Tbl_New_ColumnValue ,这不是我想要的。
我希望能跑:
select top 10 * from tbl_audit where Tbl_Old_ColumnValue !=Tbl_New_ColumnValue
但这不会返回任何结果。
为了获得实际更改的列的结果,我需要运行一个非常昂贵的查询:
select top 10
old.AuditId,
old.Tbl_Old_ColumnValue,
new.Tbl_Old_ColumnValue as [Tbl_New_ColumnValue]
from tbl_audit [old]
join Tbl_Audit [new]
on [ol].Tbl_Id= [new].Tbl_Id and [old].AuditId != [new].AuditId
where [old].Tbl_Old_ColumnValue != [new].Tbl_Old_ColumnValue
结果:
AuditId Tbl_Id Tbl_Old_ColumnValue Tbl_New_ColumnValue
10051 1 old_value old_value
10052 1 new_value new_value
但这并没有达到我的预期:
AuditId Tbl_Id Tbl_Old_ColumnValue Tbl_New_ColumnValue
10057 1 old_value Some New Value
奇怪的是,如果我直接通过 SSMS 修改列:
update Tbl set Tbl.ColumnValue = 'Some New Value'
我看到了我对触发器的期望:
AuditId Tbl_Id Tbl_Old_ColumnValue Tbl_New_ColumnValue
10057 1 old_value Some New Value
我做错了什么?
另外,我如何消除对 update(ColumnName) 实际上是错误的行的审计。 IE,ColumnName(即使已设置)在设置为上一个/旧值时不会被审核。
【问题讨论】:
标签: sql sql-server tsql triggers audit