Я использовал свою собственную систему отслеживания изменений, используя столбец XML в моей таблице изменений, что делает ее более гибкой. Также делает триггер довольно общим.
Предполагается, что у вас уже есть триггеры для создания строк аудита, а в исходной таблице есть столбец с именем «Версия» типа ROWVERSION:
INSERT INTO [Changes].Sites
(
SiteID,
Operation,
Version,
ModifiedOn,
DataChange
)
SELECT
IsNull( I.SiteID, D.SiteID ),
CASE
WHEN D.[Version] IS NULL AND I.[Version] IS NOT NULL THEN 'I'
WHEN D.[Version] IS NOT NULL AND I.[Version] IS NOT NULL THEN 'U'
WHEN D.[Version] IS NOT NULL AND I.[Version] IS NULL THEN 'D'
ELSE '?'
END,
IsNull( I.Version, D.Version ),
SysDateTimeOffset(),
(
SELECT
[Deleted] = ( SELECT * FROM deleted D1 WHERE D1.SiteID = D.SiteID FOR XML PATH(''), TYPE ),
[Inserted] = ( SELECT * FROM inserted I1 WHERE I1.SiteID = I.SiteID FOR XML PATH(''), TYPE )
FOR XML PATH('Changes')
)
FROM deleted D
FULL JOIN inserted I
ON D.SiteID = I.SiteID
Единственная вещь в этом запросе, специфичная для моей таблицы, это первичный ключ. Генерация шаблона для создания этих запросов будет довольно простой (можно даже сделать это в SQL, используя sys.tables и т. Д.).