Триггеры удаления / создания в вопросе о транзакции - сработает ли триггер - PullRequest
0 голосов
/ 27 февраля 2020

Я хотел бы узнать о поведении триггера (скажем, триггера «после обновления»), который сбрасывается в начале транзакции, а затем воссоздается в конце транзакции, в частности, будет ли триггер выполнить во время фазы фиксации транзакции (при условии, что в середине транзакции я выполнил несколько сценариев, которые обычно запускают триггер)?

Рассмотрим этот пример.

  1. Запуск транзакции
  2. Триггер сброса
  3. Запуск сценариев, которые вносят изменения в таблицу, которые обычно вызывают триггер (отброшенный)
  4. Повторно создайте (пропущенный) триггер
  5. Commit Transaction

В строке № 5, когда база данных фиксирует всю транзакцию, будет запущен заново созданный триггер или нет?

UPDATE

Я хотел бы перефразировать вопрос, если это невозможно / или хорошая идея сделать это таким образом. Я думаю, что вместо удаления / повторного создания лучшим решением будет отключить / включить триггер. При этом, когда триггер включен, он будет запущен в конце транзакции?

ОБНОВЛЕНИЕ 2

Как предложено всеми, для моего сценария сделайте следующее:

Запуск триггера, отключить триггер, запустить SQL, включить триг. Commit TX

Триггер не сработает, что я и хочу.

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Триггер не запустится, если вы ВКЛЮЧИТЕ триггер между оператором DML и COMMIT; Например, это не приведет к выполнению триггера:

BEGIN TRANSACTION;  

ALTER TABLE [dbo].[myTable] DISABLE TRIGGER [trg_trgtest]

UPDATE [dbo].[myTable]
SET [language] = 'fr'
WHERE id = 6

ALTER TABLE [dbo].[myTable] ENABLE TRIGGER [trg_trgtest]

COMMIT; 
1 голос
/ 27 февраля 2020

Удаление триггера помещает на таблицу исключительную блокировку метаданных (Sch-M), предотвращая любые запросы или DML, для которых требуется блокировка стабильности схемы (Sch-S), на время транзакции.

EG

use tempdb
go

drop table if exists foo
go
create table foo(id int primary key)

go
create trigger tg_foo on foo after insert
as
begin
  select 'tg_foo trigger running' msg
end

go

begin transaction
go
drop trigger tg_foo 
go
select o.name, o.type_desc, request_mode
from sys.dm_tran_locks tl
join sys.objects o
  on o.object_id = tl.resource_associated_entity_id
where request_session_id = @@spid 
and o.is_ms_shipped = 0

optputs

name                type_desc   request_mode
------------------- ----------- --------------
foo                 USER_TABLE  Sch-M

(1 row affected)

Таким образом, если вы сбросите триггер в начале транзакции, весь доступ к этой таблице будет заблокирован, пока вы не подтвердите или откат транзакции.

И так

будет запускаться триггером во время фазы фиксации транзакции (при условии, что в середине транзакции я выполнил несколько сценариев, которые обычно запускают триггер)?

Таким образом, при коммите сценарий, который обычно "запускает триггер", разблокируется и запускается, активируя триггер как обычно.

0 голосов
/ 27 февраля 2020

Если вы отключите триггер, затем выполните и подтвердите транзакцию, а затем снова включите триггер, триггер не будет «запущен» для уже завершенной транзакции.

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