我在数据库中有一个大表,我想跟踪对各个记录所做的更改。更确切地说,我想记录日期和对列进行的更改。使用触发器保存SQL Server 2008中的更新列
由于表格中有25个以上的列,我不想单独测试它们。
日志记录表看起来像ID-Date-Table-Column-OldValue-NewValue
在我AFTER UPDATE
触发我想检查哪些列有不同的值,并将其登录到我的表。
我知道我可以得到表的列有:
DECLARE @meta_table TABLE (
idx smallint Primary Key IDENTITY(1,1)
, TABLE_NAME nchar(100), COLUMN_NAME nchar(100), COLUMN_ID int
)
INSERT @meta_table
SELECT TABLE_NAME, COLUMN_NAME,
COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME),
COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM MYDATABASE.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTable';
我可以遍历列:
SET @i = 1
SET @numrows = (SELECT COUNT(*) FROM @meta_table)
IF @numrows > 0
WHILE (@i <= (SELECT MAX(idx) FROM @meta_table))
BEGIN
SET @col = (SELECT COLUMN_NAME FROM @meta_table WHERE idx = @i)
-- do something with @col
SET @i = @i + 1
END
在第一个步骤,我想检查所有列,但像这样的东西不起作用
IF (SELECT @col FROM inserted) <> (SELECT @col FROM deleted)
BEGIN
-- INSERT into logging table ...
END
此外,这只会检查第一行的更新,所以我woul d需要为删除/插入表中的每一行执行此操作。
你看过COLUMNS_UPDATED()吗? – HABO