我有一个以标识列作为主键的表。
一切都很好,直到几天前,使用此表的应用程序开始抱怨 PK 违规。起初我认为这是不可能的,直到我记得DBCC CHECKIDENT。魔术函数告诉我“当前列值”高于“当前标识值”。我重新设置为最高值,一切似乎又恢复了。
我的问题是,为了防止将来再次发生这种情况,这种不同步问题的可能原因是什么?以及如何预防?
我有一个以标识列作为主键的表。
一切都很好,直到几天前,使用此表的应用程序开始抱怨 PK 违规。起初我认为这是不可能的,直到我记得DBCC CHECKIDENT。魔术函数告诉我“当前列值”高于“当前标识值”。我重新设置为最高值,一切似乎又恢复了。
我的问题是,为了防止将来再次发生这种情况,这种不同步问题的可能原因是什么?以及如何预防?
听起来您必须搜索代码才能找到打开 IDENTITY_INSERT 的实例,然后插入一个(可能是高编号的 ident 列)键。您的应用程序过去可能很幸运,因为插入的(和任意的)PK 值在种子值内 - 可能是由于删除等原因。
除非您正在执行计划维护并且在非高峰时段处于单用户模式,否则不应在生产环境中打开身份插入。它会影响任何尝试插入记录的人(您的正常插入过程会出错,因为它没有指定身份),而它被打开并且使用它是一种非常糟糕的做法!如果您有开发人员或流程在您的生产环境中使用它,您需要立即重新考虑您的流程。
开发人员不应该拥有生产权限,仅此一步就可以防止您的问题在未来再次发生,因为 dba 不允许在不考虑它会影响什么的情况下打开身份插入。我同意 Josh,检查任何正在运行的 ETL 导入,特别是查找在问题开始时运行的一个。
如果您有开发人员更改身份值或打开身份插入,您需要教育他们为什么这是一个非常糟糕的做法。标识值一旦插入就不应更改,因为这也会影响所有相关表。