Я провел несколько тестов, и, видимо, ваш код делает именно то, что вы хотите. Вот мой протокол испытаний:
-- 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
будет вне транзакции.