Не думаю, что вы понимаете триггеры - срабатывание триггера связано с оператором, с которым они связаны, а не с фиксацией транзакции. Два сценария:
Сценарий 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)
Откройте два соединения с одной и той же БД, вставьте один скрипт в каждое соединение. Запуск сценария 1. Когда отобразится сообщение «Выполнить сценарий 2 сейчас», переключитесь на другое соединение. Вы увидите, что вы можете выбрать незафиксированные данные из T2, даже если эти данные вставляются триггером. (Это также подразумевает, что соответствующие блокировки удерживаются на T2 сценарием 1, пока не сработает триггер).
Поскольку это подразумевает, что эквивалент того, что вы запрашиваете, - это просто вставить в базовую таблицу и оставить транзакцию открытой, вы можете сделать это.
Если вы хотите скрыть фактическую форму таблицы от пользователей, создайте представление и запишите на нем триггеры для обновления базовых таблиц. Как уже говорилось выше, как только вы выполнили операцию DML с представлением, триггеры сработают, и вы будете удерживать блокировки на базовой таблице. В зависимости от уровня изоляции транзакции других соединений они могут видеть ваши изменения или блокироваться до фиксации транзакции.