就是IDENTITY_INSERT一次只能在一个数据库表中设置为 ON,但是为什么呢?由于IDENTITY
列不是全局唯一的,我想不出同时将身份插入多个表可能导致的任何危险情况(至少不比通常使用 IDENTITY INSERT 捏造更危险)。
IDENTITY INSERT 应该很少使用,但是硬限制的原因是什么?
就是IDENTITY_INSERT一次只能在一个数据库表中设置为 ON,但是为什么呢?由于IDENTITY
列不是全局唯一的,我想不出同时将身份插入多个表可能导致的任何危险情况(至少不比通常使用 IDENTITY INSERT 捏造更危险)。
IDENTITY INSERT 应该很少使用,但是硬限制的原因是什么?
我认为这是让它变得困难。如果你可以一直打开它,为什么还要有一个身份字段?
但实际上有几个限制:
基于与连接相关的限制,我认为主要是因为它永远不会意外打开。
想象一下,如果有人在您的一张表上打开了 ID 插入,那么您没有意识到并且执行了(通常)无效的插入,破坏了您的 ID 字段的完整性?
请记住,如果没有约束或唯一索引,ID 字段可能具有重复值...
我的猜测是这是由于实施的限制。在多个表上允许此设置可能会影响性能:
由于这是一个会话参数,因此允许在单个表上激活设置意味着它是简单的标志和表的对象 id 存储在会话中,服务器端。也许这只是一个整数:如果没有 IDENTITY_INSERT 处于活动状态,则为 0,以及表的一些 databaseid + objectid 编码。
允许在会话中的多个表上设置参数意味着服务器将存储此类对象的动态列表并检查每个插入语句。想象一个会话激活一千个表的参数:
另外我怀疑 set identity_insert on 对服务器的性能有广泛的影响。在 sybase 中有一个“标识刻录设置因子”,它允许保存一个表的标识计数器的值,该值只保存一次(该值保存在内存中,偶尔会在服务器上写入磁盘关闭 )。SQL Server 基于相同的代码,因此可能有一些类似的优化,但在表上激活 identity_insert 可能会限制服务器为每个插入保存标识值,因为否则它不能保证最大间隙大小。因此,如果一个会话对一个表中的插入产生了性能影响,这可能是可以接受的,但如果它可以对服务器上的所有 auto_increment 表产生性能影响,那就不行了。