什么可能导致IDENTITY列损坏?

时间:2008-10-27 01:30:27

标签: sql-server-2005 identity

昨天我遇到了一个不寻常的问题,我突然无法将记录插入带有标识列的表中。

这样的简单插入:INSERT INTO MyTable(Column1,Column2)VALUES('text',236764)

开始抛出主键约束违规。

我在表上运行了DBCC CHECKIDENT,并意识到SQL Server已经停止更新上次使用的值,因此当它插入时,它使用旧值递增,并且新的标识值通常已经存在于表中,因此违规错误。

解决问题不是问题,我只是将表重新接种到下一个最高序列号,但我以前从未见过这种情况!

有没有人知道什么可能导致SQL Server停止更新身份属性,以及我可能在哪里寻找证据?没有复制或涉及任何触发器,它只是一个普通的旧表。

编辑:SQL Log Rescue本来是理想的,但它只适用于SQL Server 2000.是否有类似的工具用于SQL 2005日志?

2 个答案:

答案 0 :(得分:1)

如果有人使用SET IDENTITY_INSERT ON插入到表中,则某人可能绝对输入了表的无效值。这将是我的第一个猜测。您可以使用像SQL Log Rescue这样的日志分析器在事务日志中及时返回,看看您是否能找到谁是搞砸了您数据的坏人......

答案 1 :(得分:1)

我认为SET IDENTITY_INSERT ON会重置身份。

来自BOL

  

如果插入的值大于   当前的身份值   表,SQL Server自动使用   新插入的值作为当前值   身份价值。

我能够重现此问题的唯一方法是使用DBCC CHECKIDENT手动将种子设置得太低。

相关问题