7

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

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

开始引发主键约束违规。

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

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

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

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

4

2 回答 2

1

如果有人使用SET IDENTITY_INSERT ON插入到表中,则绝对可能有人为表输入了无效值。那将是我的第一个猜测。您可以使用SQL Log Rescue之类的日志分析器通过事务日志及时回溯,看看您是否可以找到谁是坏人谁弄乱了您的数据......

于 2008-10-27T03:56:43.450 回答
1

我认为 SET IDENTITY_INSERT ON 重新植入身份。

来自 BOL

如果插入的值大于表的当前标识值,SQL Server 会自动使用新插入的值作为当前标识值。

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

于 2008-10-27T04:57:14.640 回答