Почему проверка на UPDATE (<column>) возвращает false?

Я создал триггер в 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), но триггер, тем не менее, будет выполнен, когда я выполню приведенный выше оператор.

Я не понимаю, почему это происходит.

Я не знаю эту тему, но, по моему мнению, возможная причина может заключаться в том, что до строки UPDATE(SyncToTimeTac) нет оператора UPDATE, может быть ..?

Barbaros Özhan 08.10.2018 12:10

@BennoDual, почему вы не используете вместо этого удаленные, вставленные таблицы? вот так IF NOT EXISTS(SELECT * FROM inserted WHERE SyncToTimeTac = 0x30) AND NOT EXISTS(SELECT * FROM deleted WHERE SyncToTimeTac = 0x30)

iSR5 08.10.2018 12:15

Я не могу воспроизвести эту проблему: sqlfiddle.com/#!18/938b9/3. На другой ноте: Отказ от вредных привычек: использование псевдонимов таблиц, таких как (a, b, c) или (t1, t2, t3)

Larnu 08.10.2018 12:17

Даже если бы эта логика сработала, при срабатывании для INSERT столбец каждый был UPDATEd, и поэтому здесь что-то не так (триггер, как написано, никогда не будет выполнять дальнейшую логику для вставки, поэтому либо логика неверна, либо триггер не должен срабатывать для INSERT).

Damien_The_Unbeliever 08.10.2018 12:17
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен, почему логика триггера выполняется, даже если вы специально обновляете 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, только если значение этого столбца не изменилось.

Другие вопросы по теме