在生产sql server中启用Identity_Insert有什么缺点吗

在生产sql server中启用Identity_Insert有什么缺点吗,sql,sql-server,unit-testing,identity-insert,Sql,Sql Server,Unit Testing,Identity Insert,我执行单元测试,将数据记录添加/插入到具有列名Id的表中,列名Id是标识列 在单元测试中,我手动插入id。这样我就可以在insert语句之前将Identiy_insert设置为ON 为生产服务器启用此功能是否有任何缺点 或者我应该改变我的单元测试方法吗?插入名称字段的值并检索 并断言应该充分证明为集成插入了数据记录 清酒。来自MSDN: 在任何时候,会话中只有一个表的IDENTITY_INSERT属性可以设置为ON。如果一个表已将此属性设置为ON,并且为另一个表发出set IDENTITY_IN

我执行单元测试,将数据记录添加/插入到具有列名Id的表中,列名Id是标识列

在单元测试中,我手动插入id。这样我就可以在insert语句之前将Identiy_insert设置为ON

为生产服务器启用此功能是否有任何缺点

或者我应该改变我的单元测试方法吗?插入名称字段的值并检索

并断言应该充分证明为集成插入了数据记录

清酒。

来自MSDN:

在任何时候,会话中只有一个表的IDENTITY_INSERT属性可以设置为ON。如果一个表已将此属性设置为ON,并且为另一个表发出set IDENTITY_INSERT ON语句,SQL Server将返回一条错误消息,说明set IDENTITY_INSERT已启用,并报告为其设置的表

一般来说,我不建议在生产环境中使用IDENTITY_INSERT来避免并发问题。
至于单元测试,我建议创建一个模拟的数据访问层,而不是依赖一个真实的数据库。

这不是一个可以继续使用的特性。它对每个连接都有效

尝试一下,在SSMS上打开一个连接,并将其设置为一个表。
然后打开另一个连接,您将看到,如果您尝试在同一个表中插入标识,它将失败。

标识手动插入ID将仅用于集成测试目的。稍后在生产服务器上将不会手动插入ID。-虽然这是可能的,因为它是打开的,但我的意思是,你不能无限期地打开它。它是每个会话都有效的设置。这就是为什么我告诉你在SSM上测试。打开两个到同一数据库的连接,打开其中一个数据库中talbe的identity insert,然后尝试使用另一个连接插入该标识。你会看到它会失败,那是为了什么?在我的集成测试中,不会打开第二个连接,然后访问同一个表!那么重点是什么呢。你想对我说什么?我想告诉你,身份插入不是你能百分之百坚持的东西。如果您将其设置为打开,则它将仅打开到您用来设置它的连接。它将关闭到每个子问题的连接。如果你照我说的做,你会看到的。哈哈,天哪,你还是不明白我想说什么。但是无论如何,很高兴你解决了你的问题手动插入只来自我的集成测试。在生产环境中,用户插入的数据记录没有明确插入ID。我发现模拟数据库层变得很麻烦,实际上没有比管理自己的数据设置/使用的一组好的集成测试增加更多的价值。在大多数情况下,嘲弄浪费时间,增加了解决方案的复杂性和额外的编码时间,但无法真正了解数据在字段中的工作方式。IDENTITY_INSERT ON设置是一个例外设置,您应该仅在绝对需要时打开,然后尽快关闭。很难理解实际问题是什么。