SQL SERVER 2005:在After Insert触发器中使用INSERT后,影响SCOPE_IDENTITY 问题
一、一点概念
当插入一条记录后,我们通常使用@@IDENTITY 等函数获取该表的自增量值。
在SQL SERVER中,给出了三个获取自增量值的函数:
IDENT_CURRENT | 返回为某个会话和用域中的指定表生成的最新标识值。 |
@@IDENTITY | 返回为跨所有作用域的当前会话中的某个表生成的最新标识值。 |
SCOPE_IDENTITY | 返回为当前会话和当前作用域中的某个表生成的最新标识值。 |
在上述三种方法中,只有IDENT_CURRENT 需要指定表:
IDENT_CURRENT( 'table_name' )
然而在实际使用中,我们通常喜欢使用SCOPE_IDENTITY 来获取自增量值。
二、问题的产生
在数据库的操作中,为了完成数据关连关系,通常使用触发器来完成。
例如,我们在一个表(Tab1)中定义了一个触发器,当向该表(Tab1)插入一条记录后,我们希望根据插入的条件,向另一张表(Tab2)插入与该表相关的数据。
下面是一个简单的示例:
CREATE TRIGGER [dbo].[Test] |
上面是一个简单的触发器。
我们使用下列方法,向TAB1插入一行,并获取该表的自增量值:
INSERT INTO Tab1( SELECT SCOPE_IDENTITY |
如果加入了上述的触发器,我们将无法获得Tab1的正确的自增量值。因为该自增量的值,在触发器中,被改变成了Tab2的自增量值。
正确的方法应该是(注意兰色部分):
INSERT INTO Tab1( SELECT IDENT_CURRENT('Tab1') |