Я не могу найти простой / общий способ регистрации в таблице аудита столбцов, измененных в некоторых таблицах.
Я попытался сделать это с помощью Trigger on после обновления следующим образом:
Прежде всего определение таблицы аудита:
CREATE TABLE [Audit](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Date] [datetime] NOT NULL default GETDATE(),
[IdTypeAudit] [int] NOT NULL, --2 for Modify
[UserName] [varchar](50) NULL,
[TableName] [varchar](50) NOT NULL,
[ColumnName] [varchar](50) NULL,
[OldData] [varchar](50) NULL,
[NewData] [varchar](50) NULL )
Следующий триггер на AFTER UPDATE в любой таблице:
DECLARE
@sql varchar(8000),
@col int,
@colcount int
select @colcount = count(*) from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MyTable'
set @col = 1
while(@col < @colcount )
begin
set @sql=
'INSERT INTO Audit
SELECT 2, UserNameLastModif, ''MyTable'', COL_NAME(Object_id(''MyTable''), '+ convert(varchar,@col) +'), Deleted.'
+ COL_NAME(Object_id('MyTable'), @col) + ', Inserted.' + COL_NAME(Object_id('MyTable'), @col) + '
FROM Inserted LEFT JOIN Deleted ON Inserted.[MyTableId] = Deleted.[MyTableId]
WHERE COALESCE(Deleted.' + COL_NAME(Object_id('MyTable'), @col) + ', '''') <> COALESCE(Inserted.' + COL_NAME(Object_id('MyTable'), @col) + ', '''')'
--UserNameLastModif is an optional column on MyTable
exec(@sql)
set @col = @col + 1
end
Проблемы
- Вставленный и удаленный потерял контекст, когда я использую функцию exec
- Кажется, что число не всегда является соответствующим числом, кажется, если вы создаете таблицу с 20столбцы, и вы удаляете один и создаете другой, последний имеет номер> @ colcount
Я искал решение для всей сети, но я не смог выяснить
Любая идея?
Спасибо!