我在數據庫中有一個大表,我想跟蹤對各個記錄所做的更改。更確切地說,我想記錄日期和對列進行的更改。使用觸發器保存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