临时表上的触发器和事务

sql*_*ild 1 sql sql-server triggers sql-server-2005 temp-tables

我们可以在临时表上创建触发器和事务吗?

当用户将插入数据时,如果它已提交,则触发器将被触发,并且该数据将从临时表进入实际表.

当SQL服务停止或服务器将关闭时,临时表将自动删除.

或者我应该使用另一个实际的表,其中首先插入数据,然后如果它被提交,则触发器将被触发,数据将被发送到主表,然后我将执行截断查询以删除数据从接口表中删除重复数据.

Dam*_*ver 6

我不认为您理解触发器 - 触发器触发与它们相关的语句相关联,而不是在事务提交时.两个脚本:

脚本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
Run Code Online (Sandbox Code Playgroud)

脚本2:

select * from T2 with (nolock)
Run Code Online (Sandbox Code Playgroud)

打开到同一个DB的两个连接,在每个连接中放置一个脚本.运行脚本1.当它显示消息"立即运行脚本2"时,切换到另一个连接.您将看到您能够从T2中选择未提交的数据,即使该数据是由触发器插入的.(这也意味着脚本1在T2上保持适当的锁,直到触发器提交为止).


因为这意味着你所要求的相当于只是插入基表并保持你的事务处于打开状态,你可以这样做.

如果要从用户隐藏表的实际形状,请创建一个视图并在其上写入触发器以更新基表.如上所述,只要您对视图执行了DML操作,触发器就会被触发,并且您将对基表持有锁.根据其他连接的事务隔离级别,它们可能会看到您的更改,或者在事务提交之前被阻止.