身份列不同步

时间:2009-07-20 20:41:22

标签: sql-server identity-column

我有一个表格,其中标识列为主键。

一直都好,直到几天前,使用此表的应用程序开始抱怨PK违规。起初我以为这是不可能的,直到我记得DBCC CHECKIDENT。神奇的功能告诉我'当前列值'高于'当前标识值'。我重新获得了最高价值,而且一切看起来都很好。

我的问题是,为了防止将来再次发生这种情况,造成这种不同步问题的可能原因是什么?以及如何预防?

2 个答案:

答案 0 :(得分:3)

听起来你必须搜索代码才能找到IDENTITY_INSERT打开的实例,然后插入一个(可能是高编号的ident列)键。您的应用程序过去可能很幸运,因为插入的(和任意的)PK值在种子值内 - 可能是由于删除等原因。

答案 1 :(得分:0)

除非您正在进行计划维护并且在非高峰时段处于单用户模式,否则不应在生产环境中打开标识插入。它会影响任何试图插入记录的人(你的正常插入过程会因为没有指定身份而出错),而它被打开并使用它是一种非常糟糕的做法!如果您的prod环境中有开发人员或流程使用此工具,则需要立即重新考虑您的流程。

开发人员不应该拥有生产权,只有这一步可能会阻止您将来重新解决问题,因为dba不允许打开identitiy插件而不考虑它会影响什么。我同意Josh,检查正在运行的任何ETL导入,特别是查找在问题开始时运行的ETL导入。

如果您有开发人员更改身份值或转换身份插入,您需要教育他们为什么这是一个非常糟糕的做法。插入标识值后,不应更改标识值,因为它也会影响所有相关表。