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

Откуда:
Сообщений: 321
Проблема состоит в том, что триггер иногда срабатывает, иногда нет. Не срабатывает при обновлении из приложения, иногда не срабатывает из студии. Даже не знаю в чем дело. Пользователей висит на базе около 60 чел. Подскажите, хоть куда смотреть....

CREATE  TRIGGER [CarStatus] 
   ON  [CAR]
   AFTER UPDATE
AS 
BEGIN
	SET NOCOUNT ON;

   if (Update(STATUS))
	BEGIN
		declare @status int, @car int
		select @status = STATUS, @car=CAID from Inserted
		update CAR_PERIODS set STATUS = @status where CAR = @car
		update REESTR set STATUS = @status where CAR = @car
	end
END
25 дек 09, 15:16    [8119430]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
Inserted - это таблица со всеми вытекающими отсюда последствиями. (это намёк на то , что там может быть не одна запись)
25 дек 09, 15:20    [8119451]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Проходимец
Member

Откуда: Москва
Сообщений: 571
как-то так
if update(status) begin
	update CAR_PERIODS set STATUS = i.STATUS from inserted i where CAR_PERIODS.car = i.car
	update REESTR set STATUS = i.STATUS from inserted i where REESTR.car = i.car
end
25 дек 09, 15:22    [8119464]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
mar55555
Member

Откуда:
Сообщений: 321
По логике работы программы по нажатию кнопки больше чем одна строчка в данном случае на update пойти не может. Как там может оказаться несколько записей?
25 дек 09, 15:39    [8119552]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
mar55555
По логике работы программы по нажатию кнопки больше чем одна строчка в данном случае на update пойти не может. Как там может оказаться несколько записей?
Очень просто.
Я запускаю MS SQL Server Management Studio, пишу в нём UPDATE, и - вуаля! - апдейчу сколько захочу!

Вообще-то, Вы имеете дело с клиент-серверной архитектурой.
Клиенты должны быть максимально отделены от сервера.
Сервер обязан обработать запрос от клиента, не зная, что это за клиент. IMHO, конечно.

А Вы пишете так, что кроме Вашей сегодняшней программы никто ничего делать на сервере не может...
25 дек 09, 15:50    [8119611]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Да, и стесняюсь спросить, а зачем там у Вас IF UPDATE(STATUS) написан?
Чего Вы этим добиться хотите?
25 дек 09, 15:52    [8119621]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
mar55555
Member

Откуда:
Сообщений: 321
Ну смысл в том, что там происходит отдельно изменение статуса, изменение сумм покупок, изменение даты редактирования. Триггер должен выполнять запросы только при изменении статуса.
25 дек 09, 15:57    [8119655]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
mar55555
Ну смысл в том, что там происходит отдельно изменение статуса, изменение сумм покупок, изменение даты редактирования. Триггер должен выполнять запросы только при изменении статуса.
Так ведь IF UPDATE(STATUS) может быть истинным, а значение никто и не менял!

Вот ведь оно как, Михалыч! ©
25 дек 09, 16:00    [8119667]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
mar55555
Member

Откуда:
Сообщений: 321
iaa
mar55555
По логике работы программы по нажатию кнопки больше чем одна строчка в данном случае на update пойти не может. Как там может оказаться несколько записей?
Очень просто.
Я запускаю MS SQL Server Management Studio, пишу в нём UPDATE, и - вуаля! - апдейчу сколько захочу!

Вообще-то, Вы имеете дело с клиент-серверной архитектурой.
Клиенты должны быть максимально отделены от сервера.
Сервер обязан обработать запрос от клиента, не зная, что это за клиент. IMHO, конечно.

А Вы пишете так, что кроме Вашей сегодняшней программы никто ничего делать на сервере не может...


Да, в том, что с сервера можно изменять сколько захочешь, это так, и действительно в данном случае не правильно(((. Но меня интересует именно проблема не срабатывания при вызове со стороны приложения.
25 дек 09, 16:00    [8119668]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
mar55555
Да, в том, что с сервера можно изменять сколько захочешь, это так
Не "с сервера", а с другого (не Вами сделанного) клиента (их же может быть мнооого).
25 дек 09, 16:04    [8119693]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
mar55555
Member

Откуда:
Сообщений: 321
Проходимец
как-то так

if update(status) begin
	update CAR_PERIODS set STATUS = i.STATUS from inserted i where CAR_PERIODS.car = i.car
	update REESTR set STATUS = i.STATUS from inserted i where REESTR.car = i.car
end


Спасибо за наглядно написанный пример. Попробую так.
25 дек 09, 16:09    [8119715]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
mar55555
Member

Откуда:
Сообщений: 321
iaa
Не "с сервера", а с другого (не Вами сделанного) клиента (их же может быть мнооого).


разработчик уверяет, что у него много быть не может.

я правильно понимаю, что таблица inserted формируется при каждом новом вызове заново? т.е. если приходят запросы одновременно, то выполнение триггеров будет последовательно для каждого запроса? или в данном случае это будет восприниматься как одни запрос и будет как раз тот самый вариант когда в таблице несколько записей?
25 дек 09, 16:18    [8119769]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
iljy
Member

Откуда:
Сообщений: 8711
mar55555

Да, в том, что с сервера можно изменять сколько захочешь, это так, и действительно в данном случае не правильно(((. Но меня интересует именно проблема не срабатывания при вызове со стороны приложения.

вот никогда не понимал - почему в людах так сильно подсознательное стремление к суициду? Казалось бы чего проще - сразу написать триггер по человечески
CREATE  TRIGGER [CarStatus] 
   ON  [CAR]
   AFTER UPDATE
AS 
BEGIN
	SET NOCOUNT ON;
	
	UPDATE cp
	SET Status = i.Status
	from CAR_PERIODS cp
		 join inserted i on cp.CAR = i.CAID
		 join deleted d on d.CAID = i.CAID and d.Status != i.Status
			
	UPDATE r
	SET Status = i.Status
	from REESTR r
		 join inserted i on r.CAR = i.CAID
		 join deleted d on d.CAID = i.CAID and d.Status != i.Status
END
Нет, мы будем упорно "упрощать" (очень относительно) задачу, сводя ее к очень частному случаю, а потом мужественно преодолевать изобретательно созданные трудности.
25 дек 09, 16:26    [8119814]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
mar55555
iaa
Не "с сервера", а с другого (не Вами сделанного) клиента (их же может быть мнооого).


разработчик уверяет, что у него много быть не может.

я правильно понимаю, что таблица inserted формируется при каждом новом вызове заново? т.е. если приходят запросы одновременно, то выполнение триггеров будет последовательно для каждого запроса? или в данном случае это будет восприниматься как одни запрос и будет как раз тот самый вариант когда в таблице несколько записей?
Триггеры выполняются в той же транзакции, что и действие, которое их вызвало.
А вот над определением действительно изменившихся статусов подумайте.
Задействуйте кроме inserted ещё и deleted
mar55555
разработчик уверяет, что у него много быть не может.
Так может говорить плохой разработчик.
25 дек 09, 16:29    [8119839]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iljy
mar55555

Да, в том, что с сервера можно изменять сколько захочешь, это так, и действительно в данном случае не правильно(((. Но меня интересует именно проблема не срабатывания при вызове со стороны приложения.

вот никогда не понимал - почему в людах так сильно подсознательное стремление к суициду? Казалось бы чего проще - сразу написать триггер по человечески
CREATE  TRIGGER [CarStatus] 
   ON  [CAR]
   AFTER UPDATE
AS 
BEGIN
	SET NOCOUNT ON;
	
	UPDATE cp
	SET Status = i.Status
	from CAR_PERIODS cp
		 join inserted i on cp.CAR = i.CAID
		 join deleted d on d.CAID = i.CAID and d.Status != i.Status
			
	UPDATE r
	SET Status = i.Status
	from REESTR r
		 join inserted i on r.CAR = i.CAID
		 join deleted d on d.CAID = i.CAID and d.Status != i.Status
END
Нет, мы будем упорно "упрощать" (очень относительно) задачу, сводя ее к очень частному случаю, а потом мужественно преодолевать изобретательно созданные трудности.
Упрощение детектед!
Кто сказал, что STATUS не может принимать значение NULL?
25 дек 09, 16:32    [8119859]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
меня смущает вообще само действие апдейта STATUS-а в подчинённых таблицах. зачем это поле в таблицах CAR_PERIODS и REESTR вообще меняется и нужно ли оно вообще там, если его значение завист от главной таблицы CAR?
25 дек 09, 16:32    [8119860]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
iljy
Member

Откуда:
Сообщений: 8711
iap
Упрощение детектед!
Кто сказал, что STATUS не может принимать значение NULL?

Ну уж извините, пусть ТС немного и собственную мясорубку задействует, не все же за него жевать
25 дек 09, 16:35    [8119886]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
mar55555
Member

Откуда:
Сообщений: 321
Проходимец
как-то так

if update(status) begin
	update CAR_PERIODS set STATUS = i.STATUS from inserted i where CAR_PERIODS.car = i.car
	update REESTR set STATUS = i.STATUS from inserted i where REESTR.car = i.car
end


Сейчас триггер выглядит так, но все равно иногда не срабатывает...
29 дек 09, 15:33    [8133308]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
mar55555

Сейчас триггер выглядит так, но все равно иногда не срабатывает...

Откуда вы узнаете, что триггер именно не сработал ?
29 дек 09, 15:37    [8133352]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
mar55555
Member

Откуда:
Сообщений: 321
ну не произошло изменений. т.е. в таблице по которой идет update статус изменен, а в других таблицах - нет. если триггер срабатывает, то почему тогда изменения не прошли?
29 дек 09, 15:42    [8133394]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
mar55555
ну не произошло изменений. т.е. в таблице по которой идет update статус изменен, а в других таблицах - нет. если триггер срабатывает, то почему тогда изменения не прошли?

Триггер не сработал и триггер не выполнил заложенные в нем действия - это разные вещи
Как вы проверяете первое и второе ?
29 дек 09, 15:44    [8133421]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
mar55555
Member

Откуда:
Сообщений: 321
Честно говоря, никак... Я могу наблюдать только результаты... При тестировании проблем не наблюдалось, а теперь вот вылезло... Можно как-нибудь в логи выводить что он отработал, что сделал и т.п.? потому как когда через профайлер смотрю, специально тестирую, все хорошо...
29 дек 09, 15:50    [8133463]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
mar55555
Честно говоря, никак... Я могу наблюдать только результаты

Т.е. вы не знаете, выполнялась ли вообще проверка if (Update(STATUS)) и все последующие команды ?
29 дек 09, 15:52    [8133479]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
mar55555
Member

Откуда:
Сообщений: 321
Да, я не знаю что происходит, когда вижу просто, что в каком-то случае, когда кто-то из пользователей вносил изменения, что произошло. При моей проверке в профайлере(при этом все выполняется) я могу просмотреть, что происходит. и триггер выполняет последовательно все, что в нем написано.
29 дек 09, 15:56    [8133517]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
mar55555
Да, я не знаю что происходит, когда вижу просто, что в каком-то случае, когда кто-то из пользователей вносил изменения, что произошло. При моей проверке в профайлере(при этом все выполняется) я могу просмотреть, что происходит. и триггер выполняет последовательно все, что в нем написано.

Т.е. вы не знаете, ни какую команду выполняет клиент, ни как выполняется триггер, ни что происходит с транзакциями в реальном клиентском приложении ?
29 дек 09, 16:24    [8133769]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить