触发器和事务临时表(trigger and transactions on temporary ta

2019-09-30 22:51发布

我们可以创建临时表触发和交易?

当用户将插入数据的话,如果它致力于则触发将被解雇,并且该数据会从临时表进入实际表。

当SQL服务将停止,或服务器将被关闭,那么临时表会被自动删除。

或应当我使用的另一个实际的表,其中第一数据将被插入,然后,如果它是致力于则触发将被发射以及所述数据将被发送到主表,然后我将执行一个截查询来删除数据从接口表,因此,除去重复的数据。

Answer 1:

我不认为你明白触发器 - 触发器触发是与他们有关,而不是事务提交时的发言。 两个脚本:

脚本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操作,触发器会已经解雇,你会保持基本表锁。 根据其它连接的事务隔离级别,他们可能会看到你的变化,或者被阻塞,直到事务提交。



Answer 2:

触发器不能在临时表中创建。 但它是一个不寻常的要求这样做。

临时表可以是交易的一部分,但表变量不能。

作为@Damien指出,触发器不火的时候,交易将提交的,而当它们在表中的动作(INSERT,UPDATE,DELETE)与相应的触发火灾发生。



Answer 3:

或者创建您可以将数据插入视图。 它会写回表,然后触发将闪光。



文章来源: trigger and transactions on temporary tables