sql >> Base de Datos >  >> RDS >> Sqlserver

disparador y transacciones en tablas temporales

No creo que entiendas los disparadores:la activación del disparador está asociada con la declaración con la que están relacionados, en lugar de cuando se confirma la transacción. Dos guiones:

Guión 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

Guión 2:

select * from T2 with (nolock)

Abra dos conexiones a la misma base de datos, coloque un script en cada conexión. Ejecute el script 1. Cuando muestre el mensaje "Ejecute el script 2 ahora", cambie a la otra conexión. Verá que puede seleccionar datos no confirmados de T2, aunque el activador inserte esos datos. (Esto también implica que el script 1 mantiene los bloqueos apropiados en T2 hasta que se confirma el activador).

Dado que esto implica que el equivalente de lo que está solicitando es simplemente insertar en la tabla base y mantener abierta su transacción, puede hacerlo.

Si desea ocultar la forma real de la tabla a los usuarios, cree una vista y escriba disparadores en eso para actualizar las tablas base. Sin embargo, como se indicó anteriormente, tan pronto como haya realizado una operación DML contra la vista, los disparadores se habrán disparado y mantendrá bloqueos contra la tabla base. Según el nivel de aislamiento de transacciones de otras conexiones, es posible que vean sus cambios o que se bloqueen hasta que se confirme la transacción.