Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Модификация триггера для Журналирования Update в таблице.  [new]
Wolfys
Member

Откуда:
Сообщений: 23
Добрые день уважаемые гуру Sql.ru !
Возник вопрос :
Как можно модифицировать мой триггер что-бы он записывал старый и новые значения в таблицу ?? ( к примеру строчка 1 старое значение, строчка 2 новое значение )
Вот сам триггер :
+
USE StoreBuildings_old;
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[WriteJurnalSmetakDogovor_INSERT]
ON [dbo].[Смета_к_Договору]
FOR Update
AS
BEGIN
SET NOCOUNT ON;
DECLARE @DateUpdate datetime

SET @DateUpdate = (SELECT GETDATE())
INSERT INTO ЖурналСмета_к_Договору Select *,@DateUpdate,(select CONVERT(nvarchar,net_address)+'\'+RTRIM(hostname)+'\'+SYSTEM_USER as ID_WORK
from master.dbo.sysprocesses WHERE spid=@@spid),'UPDATE','Изменение','' from inserted

END

GO

Триггер великолепно работает с Insert и Delete, но вот как сделать что-бы он записывал и старые значения я пока не знаю..
Зарание Спасибо.
26 май 14, 11:00    [16071779]     Ответить | Цитировать Сообщить модератору
 Re: Модификация триггера для Журналирования Update в таблице.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Wolfys
Как можно модифицировать мой триггер что-бы он записывал старый и новые значения в таблицу ??

inserted и deleted
26 май 14, 11:02    [16071805]     Ответить | Цитировать Сообщить модератору
 Re: Модификация триггера для Журналирования Update в таблице.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
А зачем логировать inserted, не подскажете?
inserted и так лежит в основной таблице.

Другое дело, имеет смысл проверять реальное изменение значений полей.
Можно ведь написать апдейт полей, не меняющий значения в полях.
Та что же, заполнять лог неинформативным мусором что ли?
26 май 14, 11:13    [16071893]     Ответить | Цитировать Сообщить модератору
 Re: Модификация триггера для Журналирования Update в таблице.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8826
Как сравнивать значения полей, курсором?
Я бы предпочел делать дамп записей, т.к. история вида "имя поля"-"старое"-"новое" плохо поддается SQL и имеет низкую производительность.
Сравнение записей дампа по требуемому полю со сдвигом в 1 строку легко выполнить.
26 май 14, 11:20    [16071938]     Ответить | Цитировать Сообщить модератору
 Re: Модификация триггера для Журналирования Update в таблице.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Владислав Колосов
Как сравнивать значения полей, курсором?
SELECT *
FROM deleted d JOIN inserted i ON d.ID=i.ID
WHERE NOT EXISTS(SELECT d.F1,d.F2,...,d.Fn INTERSECT SELECT i.F1,i.F2,...,i.Fn);
Если надо отловить только записи, в которых изменилось хоть что-нибудь, то
SELECT *
FROM deleted d JOIN inserted i ON d.ID=i.ID
WHERE NOT EXISTS(SELECT d.* INTERSECT SELECT i.*);
26 май 14, 11:27    [16072001]     Ответить | Цитировать Сообщить модератору
 Re: Модификация триггера для Журналирования Update в таблице.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8826
То есть речь не идет о записи в журнал значений только изменившихся полей.
26 май 14, 11:54    [16072278]     Ответить | Цитировать Сообщить модератору
 Re: Модификация триггера для Журналирования Update в таблице.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Владислав Колосов
То есть речь не идет о записи в журнал значений только изменившихся полей.
это кому вопрос? Спойлер читали?
Да и если бы надо было по одному старому и одному новому значению одного поля вместе с именем поля в строку записывать,
зачем курсор-то? Для универсальности? Тупиковый путь, хотя можно, конечно.
Кстати, моё мнение про такую структуру лога - очень неудобно с ним в дальнейшем работать.
Например, из-за доступа к полю через хранящееся в логе имя.
26 май 14, 12:39    [16072662]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить