在这种情况下,一次只能在一个数据库表中将IDENTITY_INSERT设置为ON,但是为什么呢?由于IDENTITY
列不是全局唯一的,所以我无法想到可能由于将标识同时插入一个以上的表而引起的任何危险情况(至少没有比使用IDENTITY INSERT进行伪造更危险)。
很少使用IDENTITY INSERT,但是硬限制的原因是什么?
在这种情况下,一次只能在一个数据库表中将IDENTITY_INSERT设置为ON,但是为什么呢?由于IDENTITY
列不是全局唯一的,所以我无法想到可能由于将标识同时插入一个以上的表而引起的任何危险情况(至少没有比使用IDENTITY INSERT进行伪造更危险)。
很少使用IDENTITY INSERT,但是硬限制的原因是什么?
Answers:
我认为这很困难。如果您可以一直将其保留,为什么还要拥有一个身份字段呢?
但是实际上有两个限制:
基于与连接有关的限制,我认为主要是因为它永远不会被意外打开。
想象一下,如果有人在您的一个表上打开了ID插入,那么您没有意识到,执行了(通常)无效的插入,破坏了ID字段的完整性吗?
如果没有约束或唯一索引,请记住ID字段可以有重复值...
IDENTITY
它,也将成为唯一的约束。当然,如果他们愿意尝试的话,很容易反驳。
我的猜测是由于实施的限制。在多个表上允许此设置可能会导致性能下降:
由于这是一个会话参数,因此允许在单个表上激活该设置意味着它是简单的标志,并且表的对象ID存储在服务器端的会话中。也许这只是一个整数:如果没有IDENTITY_INSERT处于活动状态,则为0,并且对该表进行了一些databaseid + objectid编码。
允许在一个会话中的多个表上设置该参数将意味着服务器将存储此类对象的动态列表,并针对每个insert语句对其进行检查。假设一个会话激活了1000个表的参数:
我也怀疑将identity_insert设置为on会对服务器的性能产生很大的影响。在sybase中,有一个“ 身份刻录设置因子 ”,它允许保存表的身份计数器的值,该值仅在一段时间内保存一次(该值保留在内存中,并偶尔在服务器上写入磁盘中)关掉 )。SQL Server基于相同的代码,因此可能具有一些可比的优化,但是在表上激活identity_insert可能会限制服务器为每个插入保存标识值,因为否则无法保证最大的间隙大小。因此,如果一个会话对一个表中的插入产生性能影响,这可能是可以接受的,但是如果它可以对服务器上所有auto_increment表的性能造成影响,则不可接受。
INSERT
只能一次进行一次会话,而且我很容易插入一千万个硬编码IDENTITY
值。
SET IDENTITY_INSERT
启用时用1,000,000硬编码值覆盖身份列而导致引擎崩溃,会发生什么不同的事情?我只是建议间隙大小不会影响多个表,而只会影响单个表。