Я создал триггер в SQL Server:
ALTER trigger [dbo].[TIME_PersonalTagUpdIns] on [dbo].[TIME_PersonalTag] for INSERT,UPDATE as
if not UPDATE(SyncToTimeTac)
BEGIN
update a
set a.SyncToTimeTac=0x31
from TIME_PersonalTag a inner join inserted b on a.Ident=b.Ident
where a.Erledigt = 0x31
END
Теперь, когда я выполняю
update TIME_PersonalTag set SyncToTimeTac = 0x30
цель состоит в том, чтобы не выполнять логику в триггере. Для этого я сначала проверяю if not UPDATE(SyncToTimeTac), но триггер, тем не менее, будет выполнен, когда я выполню приведенный выше оператор.
Я не понимаю, почему это происходит.
@BennoDual, почему вы не используете вместо этого удаленные, вставленные таблицы? вот так IF NOT EXISTS(SELECT * FROM inserted WHERE SyncToTimeTac = 0x30) AND NOT EXISTS(SELECT * FROM deleted WHERE SyncToTimeTac = 0x30)
Я не могу воспроизвести эту проблему: sqlfiddle.com/#!18/938b9/3. На другой ноте: Отказ от вредных привычек: использование псевдонимов таблиц, таких как (a, b, c) или (t1, t2, t3)
Даже если бы эта логика сработала, при срабатывании для INSERT столбец каждый был UPDATEd, и поэтому здесь что-то не так (триггер, как написано, никогда не будет выполнять дальнейшую логику для вставки, поэтому либо логика неверна, либо триггер не должен срабатывать для INSERT).


Я не уверен, почему логика триггера выполняется, даже если вы специально обновляете SyncToTimeTac, но я могу предложить альтернативу функции UPDATE(), которая более надежна - поскольку функция UPDATE вернет истину, даже если обновление не было успешным:
ALTER trigger [dbo].[TIME_PersonalTagUpdIns] on [dbo].[TIME_PersonalTag]
FOR INSERT,UPDATE
AS
UPDATE a
SET a.SyncToTimeTac = 0x31
FROM TIME_PersonalTag AS a
INNER JOIN inserted AS i
ON a.Ident = i.Ident
INNER JOIN deleted AS d
ON d.Ident = i.Ident
WHERE a.Erledigt = 0x31
AND ISNULL(i.SyncToTimeTac, 0x31) = ISNULL(d.SyncToTimeTac, 0x31)
END
Теперь он должен установить SyncToTimeTac на 0x31, только если значение этого столбца не изменилось.
Я не знаю эту тему, но, по моему мнению, возможная причина может заключаться в том, что до строки
UPDATE(SyncToTimeTac)нет оператора UPDATE, может быть ..?