Не мисля, че разбирате задействания - задействането на задействане е свързано с изявлението, с което са свързани, а не когато транзакцията се ангажира. Два скрипта:
Сценарий 1:
create table T1 (
ID int not null,
Val1 varchar(10) not null
)
go
create table T2 (
ID int not null,
Val2 varchar(10) not null
)
go
create trigger T_T1_I
on T1
after insert
as
insert into T2 (ID,Val2) select ID,Val1 from inserted
go
begin transaction
insert into T1 (ID,Val1)
select 10,'abc'
go
RAISERROR('Run script 2 now',10,1) WITH NOWAIT
WAITFOR DELAY '00:01:00'
go
commit
Сценарий 2:
select * from T2 with (nolock)
Отворете две връзки към една и съща база данни, поставете по един скрипт във всяка връзка. Изпълнете скрипт 1. Когато покаже съобщението „Изпълнете скрипт 2 сега“, превключете към другата връзка. Ще видите, че сте в състояние да изберете необвързани данни от T2, въпреки че тези данни са вмъкнати от тригера. (Това също така предполага, че подходящи заключвания се държат на T2 от скрипт 1, докато тригерът се ангажира).
Тъй като това означава, че еквивалентът на това, което искате, е просто да вмъкнете в основната таблица и да задържите транзакцията си отворена, можете да направите това.
Ако искате да скриете действителната форма на таблицата от потребителите, създайте изглед и напишете тригери върху това, за да актуализирате базовите таблици. Както беше посочено по-горе обаче, веднага щом извършите DML операция срещу изгледа, тригерите ще са се задействали и ще държите ключалки срещу основната таблица. В зависимост от нивото на изолация на транзакцията на други връзки, те може да видят вашите промени или да бъдат блокирани, докато транзакцията не се ангажира.