Недавно мне было поручено создать аудит таблицы базы данных, чтобы можно было отслеживать любые изменения, сделанные в любых столбцах.
Допустим, у меня есть следующая таблица:
[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))
Проблема в том, что если я добавлю поле ColumnD
к TableA
, мне придется отредактировать мою таблицу TableA.Audit
так же, как и приведенный выше скрипт.
Поэтому есть ли лучший способ сделать это?