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

Откуда:
Сообщений: 123
Нужно чтобы при изменении одного поля в таблице записывались сведения об изменении в лог - что на что поменялось, во сколько и кем. САм текст триггера (неправильный судя по всему):
ALTER TRIGGER [dbo].[PlanGraph_update] on [dbo].[PlanGraph]
   AFTER UPDATE
AS 
BEGIN
	if update(User_FK)
	begin
		insert into [Cursor].[dbo].[PlanUser_ch] (PlanGraph_FK, User_o, User_n
													 ,UpdateUser, UpdateHost, UpdateDate)
		SELECT i.PlanGraph_ID, d.User_FK, i.User_FK
		  ,suser_sname(), host_name(), getdate()
		FROM inserted i, deleted d
	END
END

Выполняю такой запрос (не отладочный, просто очередной рабочий)
UPDATE PlanGraph SET not4Oper = 1, User_FK = NULL WHERE dtcreate > '20150904' AND User_FK IS NOT NULL

В таблице обновлено (строк обработано: 3616) записей, а по результатам работы триггера (строк обработано: 13075456)!!!

В самой таблице лога вижу следующее (первые несколько строк):
id	PlanGraph_FK	User_o	User_n	UpdateUser	UpdateHost	UpdateDate
7264662	19662	F0136833-BD10-45E5-8981-519C777D90D5	NULL	PlazmaAdmin	ANNA-PC                         	2015-09-07 18:38:54.270
7264663	19662	F0136833-BD10-45E5-8981-519C777D90D5	NULL	PlazmaAdmin	ANNA-PC                         	2015-09-07 18:38:54.270
7264664	19662	F0136833-BD10-45E5-8981-519C777D90D5	NULL	PlazmaAdmin	ANNA-PC                         	2015-09-07 18:38:54.270
7264665	19662	1292BB63-D905-4EB4-ADB3-F1E48E33CE1B	NULL	PlazmaAdmin	ANNA-PC                         	2015-09-07 18:38:54.270
7264666	19662	1292BB63-D905-4EB4-ADB3-F1E48E33CE1B	NULL	PlazmaAdmin	ANNA-PC                         	2015-09-07 18:38:54.270
7264667	19662	FB41DA86-D291-44EB-8FC1-C4505A7FCE26	NULL	PlazmaAdmin	ANNA-PC                         	2015-09-07 18:38:54.270
7264668	19662	FB41DA86-D291-44EB-8FC1-C4505A7FCE26	NULL	PlazmaAdmin	ANNA-PC                         	2015-09-07 18:38:54.270
7264669	19662	FB41DA86-D291-44EB-8FC1-C4505A7FCE26	NULL	PlazmaAdmin	ANNA-PC                         	2015-09-07 18:38:54.270
7264670	19662	F0136833-BD10-45E5-8981-519C777D90D5	NULL	PlazmaAdmin	ANNA-PC                         	2015-09-07 18:38:54.270

т.е. одна строка (PlanGraph_FK тут первичный ключ из таблицы) попала много-много раз, да еще и с разными исходными значениями изменяемого поля.
Помогите пожалуйста!
7 сен 15, 19:00    [18120458]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отладить простой триггер  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Ничего удивительного: 3616 * 3616 = 13075456
Все сходится.

Сообщение было отредактировано: 7 сен 15, 19:04
7 сен 15, 19:02    [18120463]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отладить простой триггер  [new]
Conejo
Member

Откуда:
Сообщений: 123
что сделать, чтобы осталось 3616 правильных?
7 сен 15, 19:04    [18120465]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отладить простой триггер  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Conejo
что сделать, чтобы осталось 3616 правильных?
Не делать cross join двух таблиц по 3616 записей.
7 сен 15, 19:04    [18120466]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отладить простой триггер  [new]
Conejo
Member

Откуда:
Сообщений: 123
так хорошо будет:
		FROM inserted i INNER JOIN deleted d ON i.PlanGraph_ID = d.PlanGraph_ID

?
7 сен 15, 19:11    [18120475]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отладить простой триггер  [new]
Conejo
Member

Откуда:
Сообщений: 123
вроде работает, спасибо
7 сен 15, 19:53    [18120531]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить