我正在向现有数据库表添加一个触发器,该触发器由我没有编写代码的应用程序使用,并且无法更改代码。
我想将一些信息从TableA
插入到TableB
中,INSERT
到TableA
中。
- 应用程序运行
INSERT INTO TableA
<-- 此更新@@identity
- 在
TableA
上运行的ON INSERT
触发器将数据插入TableB
<- 这也使用新值更新@@identity
- 应用程序读取
@@identity
<- 这是来自TableB
而不是应用程序所期望的TableA
有没有办法不从触发器内更新@@identity
?
....由于@@identity没有作用域,因此您可以创建自己的作用域,该作用域在触发器末尾带有@@identity值
create table tableA(idA int identity(100, 1), colA int)
go
create table tableB(idB int identity(1000, 1), colB int)
go
create trigger triggerA on tableA
for insert
as
begin
if not exists(select * from inserted)
begin
return;
end
declare @tableA@@identity int = @@identity;
select @@identity as [@@identity_triggerA_in];
--add rows to tableB
insert into tableB(colB)
select object_id
from sys.all_objects
select @@identity as [@@identity_after_insert_in_tableB];
if @tableA@@identity is not null
begin
declare @sql varchar(100) = concat('create table #t(id int identity(', @tableA@@identity, ',1)); insert into #t default values');
exec (@sql);
end
select @@identity as [@@identity_triggerA_out];
end
go
insert into tableA(colA) values (10);
select @@identity;
go
insert into tableA(colA)
select top (200) 1
from sys.all_objects;
select @@identity;
go
insert into tableA(colA)
select 1
where 1=2;
select @@identity;
go
drop table tableA;
go
drop table tableB;
go