#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 = ...