【发布时间】:2011-11-01 07:13:31
【问题描述】:
我最近接到了一项任务,即在数据库表上创建审计,以便跟踪对任何列所做的任何更改。
假设我有下表:
[TableA]
------
ID
ColumnA
ColumnB
ColumnC
为了审计,我创建了一个表,例如:
[TableA.Audit]
------
ID
TableAID
UserID
Date (default value = getdate())
ColumnA
ColumnB
ColumnC
然后我写了一个脚本,如下所示:
DECLARE @currentColumnA int
,@currentColumnB int
,@currentColumnC int
SELECT TOP 1 @currentColumnA=ColumnA
,@currentColumnB=ColumnB
,@currentColumnC=ColumnC
FROM [TableA]
WHERE ID=@TableAID
UPDATE [TableA]
SET ColumnA=@ColumnA
,ColumnB=@ColumnB
,ColumnC=@ColumnC
WHERE ID=@TableAID
INSERT INTO [TableA.Audit] (TableAID, UserID, ColumnA, ColumnB, ColumnC)
VALUES (@TableAID, @UserID, NULLIF(@ColumnA, @currentColumnA), NULLIF(@ColumnB, @currentColumnB), NULLIF(@ColumnC, @currentColumnC))
问题在于,如果我要向TableA 添加一个ColumnD 字段,我将不得不编辑我的TableA.Audit 表以及上面的脚本。
那么有没有更好的方法呢?
【问题讨论】:
-
根据您的情况,this answer 可能会有所帮助。 (这是@HLGEM 所说的简化版本。)
标签: sql sql-server audit