2014-01-07 4 views
2

Можно ли консолидировать историю всех таблиц в одну таблицу?Как сохранить историю нескольких таблиц в одной таблице без использования функции CDC

Я попытался использовать функцию CDC, предоставленную SQL server 2012 enterprise edition, но для этого он создает копию каждой таблицы, что увеличивает количество таблиц в базе данных.

Возможно ли также отслеживание & имя таблицы & имя столбца, в котором DML произошел в таблице истории? Это вызовет проблемы с производительностью?

ответ

0

Это одно решение с использованием триггеров.

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] триггеров.

enter image description here

0

Если вы хотите больше, чем записать этот пользователь x обновил/удалил/вставил таблицу y id x в момент времени t, это вызовет проблемы.

Выберите таблицы, которые вы хотите проверить; создавать таблицы аудита для них и обновлять их из триггеров в базовой таблице. Много работы, но лучший способ сделать это.