У меня есть большая таблица в базе данных, и я хочу отслеживать изменения, внесенные в отдельные записи. Точнее, я хочу записать дату и изменения, внесенные в столбцы.
Поскольку в таблице более 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
Кроме того, это будет проверять только первую строку обновлений, поэтому мне нужно сделать это для каждой строки в удаленной / вставленной таблице.