昨天我遇到了一个不寻常的问题,我突然无法将记录插入带有标识列的表中。
这样的简单插入:INSERT INTO MyTable(Column1,Column2)VALUES('text',236764)
开始抛出主键约束违规。
我在表上运行了DBCC CHECKIDENT,并意识到SQL Server已经停止更新上次使用的值,因此当它插入时,它使用旧值递增,并且新的标识值通常已经存在于表中,因此违规错误。
解决问题不是问题,我只是将表重新接种到下一个最高序列号,但我以前从未见过这种情况!
有没有人知道什么可能导致SQL Server停止更新身份属性,以及我可能在哪里寻找证据?没有复制或涉及任何触发器,它只是一个普通的旧表。
编辑:SQL Log Rescue本来是理想的,但它只适用于SQL Server 2000.是否有类似的工具用于SQL 2005日志?
答案 0 :(得分:1)
如果有人使用SET IDENTITY_INSERT ON插入到表中,则某人可能绝对输入了表的无效值。这将是我的第一个猜测。您可以使用像SQL Log Rescue这样的日志分析器在事务日志中及时返回,看看您是否能找到谁是搞砸了您数据的坏人......
答案 1 :(得分:1)
我认为SET IDENTITY_INSERT ON会重置身份。
来自BOL
如果插入的值大于 当前的身份值 表,SQL Server自动使用 新插入的值作为当前值 身份价值。
我能够重现此问题的唯一方法是使用DBCC CHECKIDENT手动将种子设置得太低。