Я не могу найти простой/общий способ регистрации в таблице аудита, в котором таблицы были изменены на некоторые таблицы.SQL-Server Trigger on update for Audit
Я пытался сделать это с помощью триггера на после обновления таким образом:
Прежде всего определение аудита Таблица:
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
проблемы
- Inserted и Исключен потеряли контекст, когда я использую функцию EXEC
- Кажется, что colnumber не всегда корреляционное число, кажется, если вы создаете таблицу с 20 столбцами и удалить одну и создать другие, последний имеет номер> @colcount
Я искал решение для всей сети, но я couln't выяснить
Любая идея?
Спасибо!
Я понимаю решение, которое вы сказали, но это означает, что мне нужна таблица аудита для каждой таблицы, которую я хочу провести аудит, поэтому у вас есть дополнительная сложность в поиске изменений в базе данных. Спасибо за вашу помощь! Может быть, я тебе порекомендую. – Santiago
@Sanitago, вам нужна таблица аудита для каждой таблицы, иначе у вас будут проблемы с блокировкой. – HLGEM
@HLGEM: очень хорошая точка. Недавний триггер, который я написал, использует сервис-брокер (а не для аудита, но это возможное решение). Он будет стоять в очереди асинхронно, пока блокировки не будут освобождены. Хотя, если вы собираетесь так много усилий, почему бы не иметь отдельные таблицы. Они также запрашивали бы быстрее. –