Отключить триггер обновления в некоторых ситуациях

#sql-server #sql-server-2005 #triggers

#sql-сервер #sql-server-2005 #триггеры #sql-server

Вопрос:

Я написал триггер для обновления, поэтому каждый раз, когда происходит обновление, триггер будет запускаться. но только для одного из моих операторов update я не хочу, чтобы срабатывал триггер. как я могу временно отключить триггер?

Ответ №1:

В MSDN есть пример того, как использовать CONTEXT_INFO для отключения триггера только для одного сеанса.

Комментарии:

1. Если вы запустите несколько обновлений из одного и того же соединения, все они будут запущены или предотвращены.

2. @Dalex: в этом случае триггер сбросил бы CONTEXT_INFO при выходе

Ответ №2:

Используйте инструкцию disable trigger, а затем выполните обновление, как показано ниже

 DISABLE TRIGGER Person.uAddress ON Person.Address;
update ....
ENABLE Trigger Person.uAddress ON Person.Address;
  

Комментарии:

1. В моем понимании, disable trigger это повлияет и на другие обновления, если они будут выполняться одновременно. Вам пришлось бы обернуть это блокировкой таблицы

Ответ №3:

Вам следует изменить таблицу и триггер. Одним из возможных решений является добавление столбца в вашу таблицу, например, Triggered. Когда вы выполняете «обычное» обновление, вы должны вставить 1. Если вам нужно избежать обновления, тогда срабатывает = 0. Код триггера должен быть:

 IF EXISTS(SELECT * FROM INSERTED WHERE triggered=1)
--here you trigger fired
  

Ответ №4:

Аналогично ответу Dalex:

Другим решением является добавление столбца, например Triggered . И используйте что-то подобное в вашем триггере.

 IF NOT UPDATE(Triggered)
BEGIN
  RETURN;
END
  

UPDATE() просто проверяет, был ли столбец включен в триггер, а не было ли фактически изменено значение. Если каждый запрос, который вы хотите запустить, имеет триггер Triggered = 1 , он сработает. Запросы, в которых этого нет, не запускают триггер.

Вы могли бы использовать столбец nvarchar и использовать поле причины как в качестве флага, так и в качестве объяснения.

 UPDATE Users
  SET Password = ..encrypted_password..,
      Reason = 'changed password'
WHERE UserID = ...
  

и затем

 IF NOT UPDATE(Reason)
BEGIN
  RETURN;
END
  

Где, если вы обновите поле lastLogin при входе в систему, вы можете исключить причину, так как триггер не сработает.

 UPDATE Users
  SET LastLogin = getDate()
WHERE UserID = ...