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

Откуда:
Сообщений: 23
Есть триггер, реагирующий на добавление в определённую таблицу новой строки.
Триггер должен исходя из того какая именно строка была добавлена, обновить запись в другой таблице, либо добавить.
С той частью где строка добавляется у меня проблем нет.
Привожу код части, отвечающей за апдейт строки:
IF EXISTS
	(
	Select 'True'
	From Guest_db.dbo.WorkTimeControl WTC
	join Inserted i
on WTC.USER_SID = i.USER_SID
where (WTC.User_SID = i.USER_SID) AND (DAY(WTC.EVENT_TIME) = DAY(i.EVENT_TIME))
AND (WTC.WorkTime is not null)
)
BEGIN
Update Guest_db.dbo.WorkTimeControl
Set		
	Guest_db.dbo.WorkTimeControl.Event_time = INSERTED.Event_time,
	Guest_db.dbo.WorkTimeControl.WorkTIME = 
					INSERTED.Event_time -  
					(SELECT max(dbo.WorkTimeControl.EVENT_TIME)
					From dbo.WorkTimeControl WTC
					join Inserted i
					on WTC.USER_SID = i.USER_SID
					where (WTC.User_SID = i.USER_SID) AND (DAY(WTC.EVENT_TIME) = DAY(i.EVENT_TIME))
					AND (WTC.WorkTime is NULL))		
FROM INSERTED
WHERE (Guest_db.dbo.WorkTimeControl.User_SID = Inserted.USER_SID) AND (DAY(Guest_db.dbo.WorkTimeControl.EVENT_TIME) = DAY(INSERTED.EVENT_TIME))
AND (Guest_db.dbo.WorkTimeControl.WorkTime is not null)
END

Обратите внимание на строку:
Guest_db.dbo.WorkTimeControl.WorkTIME = 
					INSERTED.Event_time -  
					(SELECT max(dbo.WorkTimeControl.EVENT_TIME)
					From dbo.WorkTimeControl WTC
					join Inserted i
					on WTC.USER_SID = i.USER_SID
					where (WTC.User_SID = i.USER_SID) AND (DAY(WTC.EVENT_TIME) = DAY(i.EVENT_TIME))
					AND (WTC.WorkTime is NULL))	

Если из этой строки убрать блок SELECT, то есть привести строку к вот такому виду:
Guest_db.dbo.WorkTimeControl.WorkTIME = 
					INSERTED.Event_time
То всё работает.
А как тоолько я начинаю вычитать результат подзапроса, то фиг.
Причём в самом подзапросе я уверен и работоспособность его проверял.
10 окт 09, 15:33    [7768933]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер. Проблема с изменением строки  [new]
aleks2
Guest
Надо ж стараться
IF EXISTS
	(
	Select *
	From Guest_db.dbo.WorkTimeControl WTC
	join Inserted i
on WTC.USER_SID = i.USER_SID AND (DAY(WTC.EVENT_TIME) = DAY(i.EVENT_TIME))
-- DAY(WTC.EVENT_TIME) = DAY(i.EVENT_TIME)
-- весьма сомнительное условие, а день прошлого/позапрошлого/и т.д. месяца тоже надо апдейтить?
where (WTC.WorkTime is not null)
)
BEGIN
Update T
Set		
	Event_time = I.Event_time,
	WorkTIME = 
					I.Event_time -  
				ISNULL(
					(SELECT max(WTC.EVENT_TIME)
					From dbo.WorkTimeControl WTC
					where (WTC.WorkTime is NULL) AND WTC.USER_SID = i.USER_SID AND (DAY(WTC.EVENT_TIME) = DAY(i.EVENT_TIME))
					)
				, I.Event_time)
FROM Guest_db.dbo.WorkTimeControl T 
INNER JOIN
INSERTED I
ON T.User_SID = I.USER_SID) AND (DAY(T.EVENT_TIME) = DAY(I.EVENT_TIME))
WHERE (T.WorkTime is not null)
END
10 окт 09, 15:51    [7768969]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер. Проблема с изменением строки  [new]
DDRON
Member

Откуда:
Сообщений: 23
-- DAY(WTC.EVENT_TIME) = DAY(i.EVENT_TIME)
-- весьма сомнительное условие, а день прошлого/позапрошлого/и т.д. месяца тоже надо апдейтить?
Да, это ошибка. Надо, конечно, по всей дате проверку делать. Спасибо.

В остальном тоже спасибо, но код всё равно не работает.
Подзапрос этот NULL-значения не возвращает. Всегда как мининум одна запись подпадающяя под данные условия есть.
10 окт 09, 16:08    [7768986]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер. Проблема с изменением строки  [new]
aleks2
Guest
Блин. Чо проще, чем осмотреть результат ЭТОГО
select
	Event_time, I.Event_time,
	WorkTIME,  
					I.Event_time -  
				ISNULL(
					(SELECT max(WTC.EVENT_TIME)
					From dbo.WorkTimeControl WTC
					where (WTC.WorkTime is NULL) AND WTC.USER_SID = i.USER_SID AND (DAY(WTC.EVENT_TIME) = DAY(i.EVENT_TIME))
					)
				, I.Event_time)
FROM Guest_db.dbo.WorkTimeControl T 
INNER JOIN
INSERTED I
ON T.User_SID = I.USER_SID) AND (DAY(T.EVENT_TIME) = DAY(I.EVENT_TIME))
WHERE (T.WorkTime is not null)
а не гадать на кофейной гуще?
10 окт 09, 17:21    [7769051]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить