Это одно решение с использованием триггеров.
1 - Создайте триггер для каждой таблицы, в которую вы хотите включить историю.
2 - Скопируйте измененные данные (INS, UPD, DEL) из базовой таблицы в таблицу аудита во время действия.
3 - Храните все данные в формате XML, чтобы несколько таблиц могли хранить данные в одной и той же таблице аудита.
Я сделал это в одной из моих статей в блогах. Это отличное решение для аудита небольших объемов данных. При работе с тысячами изменений записи в секунду может возникнуть острая проблема.
Протестируйте перед развертыванием в производственной среде!
Вот таблица аудита, которая отслеживает имя таблицы, а также тип изменения.
/*
Create data level auditing - table.
*/
-- Remove table if it exists
IF EXISTS (SELECT * FROM sys.objects WHERE object_id =
OBJECT_ID(N'[ADT].[LOG_DML_CHANGES]') AND type in (N'U'))
DROP TABLE [ADT].[LOG_DML_CHANGES]
GO
CREATE TABLE [ADT].[LOG_DML_CHANGES]
(
[ChangeId]BIGINT IDENTITY(1,1) NOT NULL,
[ChangeDate] [datetime] NOT NULL,
[ChangeType] [varchar](20) NOT NULL,
[ChangeBy] [nvarchar](256) NOT NULL,
[AppName] [nvarchar](128) NOT NULL,
[HostName] [nvarchar](128) NOT NULL,
[SchemaName] [sysname] NOT NULL,
[ObjectName] [sysname] NOT NULL,
[XmlRecSet] [xml] NULL,
CONSTRAINT [pk_Ltc_ChangeId] PRIMARY KEY CLUSTERED ([ChangeId] ASC)
)
GO
Вот эта статья.
http://craftydba.com/?p=2060
На рисунке ниже показан один [LOG_DML_CHANGES] таблицу с несколькими [TRG_TRACK_DML_CHGS_XXX] триггеров.