Tôi không nghĩ rằng bạn hiểu về trình kích hoạt - việc kích hoạt trình kích hoạt được liên kết với tuyên bố rằng chúng có liên quan đến, thay vì khi giao dịch được thực hiện. Hai tập lệnh:
Tập lệnh 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
Tập lệnh 2:
select * from T2 with (nolock)
Mở hai kết nối đến cùng một DB, đặt một tập lệnh vào mỗi kết nối. Chạy tập lệnh 1. Khi nó hiển thị thông báo "Chạy tập lệnh 2 ngay bây giờ", hãy chuyển sang kết nối khác. Bạn sẽ thấy rằng bạn có thể chọn dữ liệu chưa được cam kết từ T2, ngay cả khi dữ liệu đó được trình kích hoạt chèn vào. (Điều này cũng ngụ ý rằng các khóa thích hợp đang được giữ trên T2 bởi tập lệnh 1 cho đến khi trình kích hoạt hoạt động).
Vì điều này ngụ ý rằng tương đương với những gì bạn yêu cầu là chỉ cần chèn vào bảng cơ sở và giữ giao dịch của bạn mở, bạn có thể làm điều đó.
Nếu bạn muốn ẩn hình dạng thực của bảng khỏi người dùng, hãy tạo một chế độ xem và viết các trình kích hoạt trên đó để cập nhật các bảng cơ sở. Như đã nêu ở trên, ngay sau khi bạn thực hiện thao tác DML đối với chế độ xem, các trình kích hoạt sẽ kích hoạt và bạn sẽ giữ các khóa đối với bảng cơ sở. Tùy thuộc vào mức độ cô lập giao dịch của các kết nối khác, họ có thể thấy các thay đổi của bạn hoặc bị chặn cho đến khi giao dịch được thực hiện.