是否可以从同一事务中不同表的触发器访问事务中插入记录的新值?
答案 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)
一些可能的解决方案是
在两个表中创建一个列(TransactionID UniqueIdentifier
),在事务开始后生成一个新的GUID,然后将该ID插入两个表中。然后,在触发器中,您从TransactionID
获取Inserted
,并读取第二个表WHERE TransactionID = ...
如果这些表很大,请考虑索引。
使用OUTPUT
子句将第一个插入到一些补充表中。在触发器内使用该表来了解该事务中的新ID。在提交事务之前截断该补充表。不要将该表用于任何其他进程/代码。
PS。对于(1),您可以对INT
使用BIGINT
或TransactionID
,但您需要使用某种机制来生成新的唯一ID