从触发器访问事务中其他表的新值

时间:2018-01-04 00:11:12

标签: sql-server

是否可以从同一事务中不同表的触发器访问事务中插入记录的新值?

2 个答案:

答案 0 :(得分:0)

当您在事务中触发触发器时,触发器在嵌套事务中运行,因此可以看到事先在事务中写入的所有行。

例如

create table t1(id int)

create table t2(id int)
go
create trigger tt2 on t2 after insert
as
begin
  select * from t1;
end
go

begin transaction
insert into t1(id) values (1)
insert into t2(id) values (1)
rollback

输出

(1 row affected)
id
-----------
1

(1 row affected)

(1 row affected)

因此,您可以从t2上的触发器中查看t1中的所有记录,包括受当前事务影响的所有行。但是没有固有的方法来判断t1中哪些行受当前事务的影响。

你很容易造成死锁。

答案 1 :(得分:0)

一些可能的解决方案是

  1. 在两个表中创建一个列(TransactionID UniqueIdentifier),在事务开始后生成一个新的GUID,然后将该ID插入两个表中。然后,在触发器中,您从TransactionID获取Inserted,并读取第二个表WHERE TransactionID = ...如果这些表很大,请考虑索引。

  2. 使用OUTPUT子句将第一个插入到一些补充表中。在触发器内使用该表来了解该事务中的新ID。在提交事务之前截断该补充表。不要将该表用于任何其他进程/代码。

  3. PS。对于(1),您可以对INT使用BIGINTTransactionID,但您需要使用某种机制来生成新的唯一ID