Ik denk dat je triggers niet begrijpt - het activeren van triggers wordt geassocieerd met de verklaring waaraan ze gerelateerd zijn, in plaats van wanneer de transactie wordt vastgelegd. Twee scripts:
Script 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
Script 2:
select * from T2 with (nolock)
Open twee verbindingen naar dezelfde DB, plaats één script in elke verbinding. Script uitvoeren 1. Wanneer het bericht "Script 2 nu uitvoeren" wordt weergegeven, schakelt u over naar de andere verbinding. U zult zien dat u niet-vastgelegde gegevens uit T2 kunt selecteren, ook al worden die gegevens door de trigger ingevoegd. (Dit houdt ook in dat de juiste vergrendelingen op T2 worden vastgehouden door script 1 totdat de trigger wordt vastgelegd).
Aangezien dit impliceert dat het equivalent van wat u vraagt, is om gewoon in de basistabel in te voegen en uw transactie open te houden, kunt u dat doen.
Als u de werkelijke vorm van de tafel voor gebruikers wilt verbergen, maakt u een weergave en schrijf triggers daarop om de basistabellen bij te werken. Zoals hierboven echter vermeld, zodra u een DML-bewerking tegen de weergave hebt uitgevoerd, zijn de triggers geactiveerd en houdt u vergrendelingen tegen de basistabel. Afhankelijk van het transactie-isolatieniveau van andere verbindingen, kunnen ze uw wijzigingen zien of worden geblokkeerd totdat de transactie wordt vastgelegd.