如何防止数据库触发器更新@@identity插入后



我正在向现有数据库表添加一个触发器,该触发器由我没有编写代码的应用程序使用,并且无法更改代码。

我想将一些信息从TableA插入到TableB中,INSERTTableA中。

  1. 应用程序运行INSERT INTO TableA<-- 此更新@@identity
  2. TableA上运行的ON INSERT触发器将数据插入TableB<- 这也使用新值更新@@identity
  3. 应用程序读取@@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

相关内容

  • 没有找到相关文章

最新更新