Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Отслеживание изменений полей  [new]
Lolka1
Guest
Добрый день, встала такая задача, есть таблица (около 40 полей), в нее через MERGE вставляются или обновляются данные, нужно отследить, какое именно поле (или несколько полей) было изменено при случае апдейта. Потом составить отчет по измененным полям.
Подскажите, пожалуйста, чем реализовать это отслеживание полей? Через change tracking делать муторно, потому как придется каждое поле апдейченной строки проверять по маске CHANGE_TRACKING_IS_COLUMN_IN_MASK()
Есть еще идея в отдельную временную таблицу вынести старые данные и обновленные, но дальше придумать не могу..
8 апр 15, 10:29    [17486915]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание изменений полей  [new]
Glory
Member

Откуда:
Сообщений: 104751
Lolka1
делать муторно,потому как придется каждое поле апдейченной строки проверять по маске CHANGE_TRACKING_IS_COLUMN_IN_MASK()

Подобным образом придется проверять при любом способе
8 апр 15, 10:31    [17486930]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание изменений полей  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Lolka1,

да сделайте просто историческую табличку, - типа копии основной + поля типа , кто, когда, что поменял.

+ триггера на ins upd del.

далее можно построить отчет за произвольный период по исторической табличке.
8 апр 15, 10:46    [17487014]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание изменений полей  [new]
Lolka1
Guest
Jaffar,

Так сначала и думал, но триггер, в котором смотрится изменение 40 полей смущает меня.
Я наешл решение, мб кому пригодится

http://www.kodyaz.com/articles/sql-string-manipulation-to-find-difference.aspx
8 апр 15, 10:51    [17487053]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание изменений полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Jaffar
да сделайте просто историческую табличку, - типа копии основной + поля типа , кто, когда, что поменял.
Lolka1
Так сначала и думал, но триггер, в котором смотрится изменение 40 полей смущает меня.
Надо логировать только строки, в которых изменилось значение хоть одного из логирующихся 40 полей.
Но это же очень просто:
SELECT * FROM inserted i JOIN deleted d ON i.PK=d.PK
WHERE NOT EXISTS
(
 SELECT i.F1,i.F2,...,i.F40
 INTERSECT
 SELECT d.F1,d.F2,...,d.F40
)
8 апр 15, 12:03    [17487604]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание изменений полей  [new]
Lolka1
Guest
iap,

Строки мы так отловим, согласен, но новые значения уже измененных полей из этого будет вытащить трудно
8 апр 15, 12:40    [17487823]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание изменений полей  [new]
Lolka1
Guest
iap,

И эти строки я ловлю через OUTPUT из процедуры MERGE
8 апр 15, 12:46    [17487863]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание изменений полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Lolka1
iap,

И эти строки я ловлю через OUTPUT из процедуры MERGE
Триггер надо сделать. Проще всего.
Только в триггере не используйте @@ROWCOUNT -
в момент запуска триггера там будет общее число записей, затронутых MERGE (и вставка и удаление и изменение).
8 апр 15, 12:58    [17487962]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание изменений полей  [new]
Lolka1
Guest
iap,

Заюзал тот скрипт, что выкинул в ссылке. Работатет прекрасно и быстро, как раз то, что нужно
8 апр 15, 13:31    [17488214]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить