2013-09-18 2 views
0

Нам не разрешено использовать CDC.Отслеживание изменений и отчетность

У нас есть требование, чтобы сообщить об изменениях, внесенных в таблицу, в формате:

On [Это дата], пользователь [UserName] изменил поле [FieldName] из [OldValue] на [ Новое значение]

Моя идея заключается в том, чтобы использовать Update/Вставить триггер на столе, вызовите его TableA и записать строку в новый TableA_Tracking tablem который AHS те же столбцы, а также в качестве внешнего ключа к исходная таблица.

Таблица A имеет 'LastUpdatedByUserId', а также колонку 'LastUpdateDate'.

Хранение данных с помощью триггера в порядке. Тем не менее, мне интересно, есть ли эффективный способ вернуть данные, чтобы я мог сообщить об этом в приложение.

Есть ли шаблон, который я мог бы выполнить для извлечения данных в формат таблицы, и вернуть его в интерфейс для форматирования?

Я имею в виду, что-то на линии:

WITH Track_CTE (
    Placement_TrackID, 
    PlacementId, 
    PlacementEventId, 
    CarerId, 
    FosterCareAllowanceFlag, 
    InterstateAllowanceAmount, 
    FosterCareAllowanceReason, 
    FosterCareAllowanceDate, 
    InterstateAllowanceFlag, 
    LastUpdateUser, 
    LastUpdateDate 
) 
AS 
(
    SELECT 
    Placement_TrackID, 
    PlacementId, 
    PlacementEventId, 
    CarerId, 
    FosterCareAllowanceFlag, 
    InterstateAllowanceAmount, 
    FosterCareAllowanceReason, 
    FosterCareAllowanceDate, 
    InterstateAllowanceFlag, 
    LastUpdateUser, 
    LastUpdateDate 
    FROM  
    [Placement_Track] 
) 
SELECT * 

FROM Track_CTE c1 
LEFT JOIN Track_CTE c2 
ON c2.Placement_TrackID = c1.Placement_TrackID - 1 

Где Placement_Track представляет собой таблицу, которая является прямой копией исходной таблицы, для ПК (первый столбец), за исключением. В таблице написано триггер обновлений и вставок.

У этого есть строка обновленной версии, а предыдущая версия ... и оттуда, возможно, внесите изменения? Но, я могу быть в стороне.

Я бы отфильтровал в приведенном выше примере PlacementId, так как это PK исходной таблицы, поэтому выбор будет более ограниченным. Кроме того, в этом примере единственными столбцами, которые я отслеживаю, являются FosterCareAllowanceFlag, InterstateAllowanceAmount, FosterCareAllowanceReason, FosterCareAllowanceDate и InterstateAllowanceFlag.

ответ

0

При изменении строки таблицы старые данные доступны в триггере в системной временной таблице ## deleted & новые данные доступны из таблицы ##.

Таким образом, если таблица Х (ID INT, col1 VARCHAR (5), col2 VARCHAR (100)) содержит:

ID = 1, COL1 = 'Код', col2 = 'Descrition', то эти данные обновляется через:

UPDATE X set col2 = 'Description' WHERE id = 1; 

таблица ## удален содержит идентификатор = 1, cOL1 = 'Код', col2 = 'Descrition' таблица ## вставлено содержит ID = 1, cOL1 = 'Код', col2 = «Описание '

Вы могли бы выяснить, сколько столбцов содержится в общей таблице, (при условии, что имя таблицы является de оштрафованный в переменной внутри триггера), используя INFORMATION_SCHEMA.COLUMNS, и с этой информацией не должно быть никаких проблем с циклом в столбцах таблицы, сравнивая ## deleted с ## insert, чтобы генерировать требуемые данные аудита.

Смежные вопросы