Почему проверка на UPDATE (<column>) возвращает false? - PullRequest
0 голосов
/ 08 октября 2018

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

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

1 Ответ

0 голосов
/ 08 октября 2018

Я не уверен, почему логика триггера выполняется, даже если вы специально обновили SyncToTimeTac, но я могу предложить альтернативу функции UPDATE(), которая более надежна - поскольку функция UPDATE вернетtrue, даже если обновление не было успешным:

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, только если значение этого столбца не изменилось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...