Запуск в Sql Server 2008 R2, вот мой UPDATE заявление, в котором в настоящее время работает в ПОСЛЕ триггера ВСТАВИТЬ:не может понять, почему это UPDATE заявление работает
UPDATE cases.CASEMASTER
SET HOLDLETTERSUNTIL = '1/1/9999'
FROM cases.CASEMASTER C
JOIN INSERTED I
ON I.CASEID = C.ROWID
JOIN events.EVENTLIBRARY L
ON L.ROWID = I.DEFINITIONID
WHERE L.HOLDLETTERS = 1
AND C.HOLDLETTERSUNTIL < GETDATE()
стыков все правильно, и через окно вывода я подтвердил, что условия, где условия оцениваются - в порядке - ЛОЖЬ и ИСТИНА.
И все же по какой-то причине я не могу понять, это утверждение действительно работает и пытается скрыть UPDATE. Поскольку первое условие WHERE является FALSE, я не могу для жизни меня понять, почему это ОБНОВЛЕНИЕ любых строк в случаях. CASEMASTER. Но я знаю, что это так, потому что он отключает триггер на этом столе.
Я пропущу что-то глупо очевидное, глядя на меня в лицо, то есть в обход моего предложения WHERE?
EVENTLIBRARY.HOLDLETTERS - это поле INT, которое может быть -1, 0 или 1, указывая, должно ли какое-то конкретное событие НЕ УДАЛИТЬ, NOTCHANGE или HOLD, когда оно регистрируется на случай.
CASEMASTER.HOLDLETTERUNTIL - поле DATE.
Вставляемая таблица представляет собой EVENTMASTER, который определяет фактические события, зарегистрированные в журнале.
CASEMASTER> EVENTMASTER является 1-N
EVENTMASTER> EVENTLIBRARY является N-1
И теперь я действительно запутался! Он запускает второй триггер. Но в таблице INSERTED второго триггера есть ZERO-строки. Похоже, что Sql Server запускает триггер только потому, что запускается событие запуска, даже если никакие строки не были изменены? Это что-то новое? Я всегда полагал, что если бы не было строк, то триггер AFTER UPDATE не срабатывал.
Действительно ли оно обновляет новые записи значений, условие которых является ложным? –
Вы говорите нам, что нет строки, которая имеет 'events.EVENTLIBRARY.HOLDLETTERS = 1', и все же запрос обновляет некоторые строки в таблице case.CASEMASTER? –
Да, я вручную тестирую его с помощью однострочной вставки жестко закодированных значений. И я специально использую EVENTID, для которого 'HOLDLETTERS = 0', и все же он обновляет case.CASEMASTER. Я совершенно сбит с толку. – eidylon