我们可以在临时表上创建触发器和事务吗?
当用户将插入数据时,如果它已提交,则触发器将被触发,并且该数据将从临时表进入实际表。
当SQL服务停止或服务器关闭时,临时表将自动删除。
或者我应该使用另一个实际的表,其中首先插入数据然后如果它被提交则触发器将被触发并且数据将被发送到主表然后我将执行截断查询从接口表中删除数据,从而删除重复数据。
答案 0 :(得分: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
脚本2:
select * from T2 with (nolock)
打开与同一个数据库的两个连接,在每个连接中放置一个脚本。运行脚本1.当它显示消息“立即运行脚本2”时,切换到另一个连接。您将看到您能够从T2中选择未提交的数据,即使该数据是由触发器插入的。 (这也意味着脚本1在T2上保持适当的锁,直到触发器提交为止。)
因为这意味着你所要求的相当于只是插入基表并保持你的交易开放,你可以这样做。
如果要从用户隐藏表的实际形状,请创建视图并在其上写入触发器以更新基表。如上所述,只要您对视图执行了DML操作,触发器就会被触发,并且您将对基表持有锁。根据其他连接的事务隔离级别,它们可能会看到您的更改,或者在事务提交之前被阻止。
答案 1 :(得分:2)
无法在临时表上创建触发器。但这是一个不寻常的要求。
临时表可以是事务的一部分,但是表变量不能。
正如@Damien指出的那样,触发器在提交事务时不会触发,而是在表上的操作(INSERT,UPDATE,DELETE)发生并触发相应的触发器时触发。
答案 2 :(得分:1)
或者创建一个可以插入数据的视图。它将回写到表中,然后触发器将触发。