Saya tidak berpikir Anda memahami pemicu - pemicu pemicu dikaitkan dengan pernyataan yang terkait dengannya, daripada saat transaksi dilakukan. Dua skrip:
Skrip 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
Skrip 2:
select * from T2 with (nolock)
Buka dua koneksi ke DB yang sama, letakkan satu skrip di setiap koneksi. Jalankan skrip 1. Saat muncul pesan "Jalankan skrip 2 sekarang", alihkan ke koneksi lain. Anda akan melihat bahwa Anda dapat memilih data yang tidak dikomit dari T2, meskipun data tersebut disisipkan oleh pemicu. (Ini juga menyiratkan bahwa kunci yang sesuai ditahan di T2 oleh skrip 1 hingga pemicu dijalankan).
Karena ini menyiratkan bahwa hal yang setara dengan apa yang Anda minta adalah memasukkan saja ke dalam tabel dasar dan menahan transaksi Anda tetap terbuka, Anda dapat melakukannya.
Jika Anda ingin menyembunyikan bentuk tabel yang sebenarnya dari pengguna, buat tampilan dan tulis pemicunya untuk memperbarui tabel dasar. Seperti yang dinyatakan di atas, segera setelah Anda melakukan operasi DML terhadap tampilan, pemicu akan diaktifkan, dan Anda akan menahan kunci pada tabel dasar. Bergantung pada tingkat isolasi transaksi dari koneksi lain, mereka mungkin melihat perubahan Anda, atau diblokir hingga transaksi dilakukan.