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