TSQL - отключение триггеров в транзакциях - PullRequest
10 голосов
/ 29 ноября 2011

Я искал все выше и ниже, и мне не удалось найти удовлетворительного ответа на мой вопрос.Что сводится к тому, как точно TRANSACTION работает в SQL Server.

По сути, это будет делать то, что я думаю, что он делает.некоторые данные в таблице, без запуска триггеров обновления, которые я имею на столе.Это для веб-приложения, поэтому я хотел бы убедиться, что если обновление таблицы из веб-приложения будет выполнено на столе, пока я выполняю свою работу, [my_update_trigger] все равно будет срабатывать для веб-приложения.*

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

С обновлением все в порядке - отключить включение и т. Д.

DISABLE TRIGGER [my_update_trigger] ON [my_table]

/*.. Do Some Updates ..*/

ENABLE TRIGGER [my_update_trigger] ON [my_table]

Посмотрите на страницу MSDN: http://msdn.microsoft.com/en-us/library/ms189748.aspx

О том, чтобы сделать его специфичным для сессии: я сомневаюсь, что это сработает - отключение / включение - это DDL, а не DML, т.е. они действуют на объекты базы данных, а не на данные. Я бы не подумал, что это будет в рамках транзакции

0 голосов
/ 03 сентября 2018

Я провел несколько тестов, и, видимо, ваш код делает именно то, что вы хотите. Вот мой протокол испытаний:

   -- Session 1 --                                   -- Session 2 --
1. BEGIN TRANSACTION
2. DISABLE TRIGGER [my_update_trigger] ON [my_table]
3.                                                   UPDATE my_table SET x = y   -- blocks
4. ROLLBACK
                                                     -- unblocks *and triggers the trigger*

Кроме того, SELECT is_disabled FROM sys.triggers where name = 'my_update_trigger'; показывает, что триггер отключен после шага 2 и активирован после шага 4.

Итак, мой вывод:

  • Да, включение / отключение триггеров является «глобальным», а не «на сеанс» (как можно увидеть, запросив sys.triggers), , но
  • Механизмы блокировки SQL Server гарантируют, что отключение триггера в транзакции блокирует таблицу, чтобы другие сеансы не "пропустили" свой триггер.

Предупреждение: DISABLE TRIGGER не вызовет неявную транзакцию . Это важно, если вы используете (классический) ADO, поскольку Connection.BeginTrans не начнет явную транзакцию, а скорее SET IMPLICIT_TRANSACTION ON. Вам нужно выполнить одну из перечисленных здесь операций перед отключением триггера, или оператор DISABLE TRIGGER будет вне транзакции.

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