トリガーを理解していないと思います。トリガーの起動は、トランザクションがコミットされたときではなく、トリガーが関連するステートメントに関連付けられています。 2 つのスクリプト:
スクリプト 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)
同じ DB への 2 つの接続を開き、各接続に 1 つのスクリプトを配置します。スクリプト 1 を実行します。「今すぐスクリプト 2 を実行してください」というメッセージが表示されたら、別の接続に切り替えます。データがトリガーによって挿入されたとしても、T2 からコミットされていないデータを選択できることがわかります。 (これは、トリガーがコミットされるまで、スクリプト 1 によって T2 で適切なロックが保持されていることも意味します)。
これは、ベース テーブルに挿入してトランザクションを開いたままにしておくことと同じことを意味するため、それを行うことができます。
テーブルの実際の形をユーザーに見せたくない場合は、view を作成します それにトリガーを書き込んで、ベーステーブルを更新します。ただし、上で述べたように、ビューに対して DML 操作を実行するとすぐに、トリガーが起動され、ベース テーブルに対してロックが保持されます。他の接続のトランザクション分離レベルによっては、変更が表示されるか、トランザクションがコミットされるまでブロックされる場合があります。