Nie sądzę, że rozumiesz wyzwalacze — wyzwalanie wyzwalacza jest powiązane z oświadczeniem, z którym są powiązane, a nie z momentem zatwierdzenia transakcji. Dwa skrypty:
Skrypt 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
Skrypt 2:
select * from T2 with (nolock)
Otwórz dwa połączenia do tej samej bazy danych, umieść jeden skrypt w każdym połączeniu. Uruchom skrypt 1. Gdy wyświetli się komunikat „Uruchom skrypt 2 teraz”, przełącz się na inne połączenie. Zobaczysz, że możesz wybrać niezatwierdzone dane z T2, mimo że te dane są wstawiane przez wyzwalacz. (Oznacza to również, że odpowiednie blokady są utrzymywane na T2 przez skrypt 1 do momentu zatwierdzenia przez wyzwalacz).
Ponieważ oznacza to, że odpowiednikiem tego, o co prosisz, jest po prostu wstawienie do tabeli bazowej i pozostawienie otwartej transakcji, możesz to zrobić.
Jeśli chcesz ukryć przed użytkownikami rzeczywisty kształt tabeli, utwórz widok i napisz na tym wyzwalacze, aby zaktualizować tabele podstawowe. Jak wspomniano powyżej, gdy tylko wykonasz operację DML względem widoku, wyzwalacze zostaną uruchomione i będziesz utrzymywał blokady względem tabeli podstawowej. W zależności od poziomu izolacji transakcji innych połączeń, mogą one zobaczyć Twoje zmiany lub zostać zablokowane do momentu zatwierdzenia transakcji.