停止触发器更改scope_identity

Way*_*eio 5 sql sql-server triggers sql-server-2008-r2

我的应用程序将一些数据插入表中.

insert into this_Table (id, value, value)
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个触发器,它使用主键执行简单插入到另一个表中.

insert into temp_wc_triggertest values ('test', GETDATE())
Run Code Online (Sandbox Code Playgroud)

我的问题是,应用程序尝试scope_identity从第一个插入中查找.但是,它会被触发器覆盖,触发器会将范围标识更改为主键temp_wc_triggertest.

如何阻止触发器覆盖scope_identity

我意识到这里没有太多代码需要帮助,这通常被归类为一个不好的问题,但我目前无权访问完整的应用程序代码,因此我希望这是可以回答的问题.

这是在SQL Server 2008 R2上

编辑:我看过代码,它确实使用scope_identity

Way*_*eio 2

它覆盖作用域标识的原因仍然不清楚,它可能与提到的错误有关。不过发现了一个修复方法:

创建了临时表“temp_wc”

然后在触发器结束时,为该表打开身份插入,并为触发器触发后我们要保留的 ID 完成插入。该方法可以被认为是再次覆盖被覆盖的作用域标识。

SET IDENTITY_INSERT ON
INSERT INTO temp_wc VALUES (@ID, 'fix scope identity error')
Run Code Online (Sandbox Code Playgroud)

  • 很好的建议 - 我在触发器中使用了临时表并且它起作用了(这让我感到惊讶,因为我想知道临时表的范围是否会持续足够长的时间)。if (select count(1) from insert) = 1 开始创建表 #TempIdTable (ResetIdentity int Identity(1, 1)) set Identity_insert #TempIdTable on insert into #TempIdTable (ResetIdentity) select UserID from insert set Identity_insert #TempIdTable off end (3认同)