Sql server 插入复制表失败-标识范围检查
我试图将数千行插入到跨两台服务器复制的数据库中的表中。从发布者或订阅者处,我得到了相同的错误:Sql server 插入复制表失败-标识范围检查,sql-server,tsql,Sql Server,Tsql,我试图将数千行插入到跨两台服务器复制的数据库中的表中。从发布者或订阅者处,我得到了相同的错误: Msg 548, Level 16, State 2, Line 1 The insert failed. It conflicted with an identity range check constraint in database 'XXX', replicated table 'dbo.NODE_ATTRIB_RSLT', column 'ID'. If the identity colum
Msg 548, Level 16, State 2, Line 1
The insert failed. It conflicted with an identity range check constraint in database 'XXX', replicated table 'dbo.NODE_ATTRIB_RSLT', column 'ID'. If the identity column is automatically managed by replication, update the range as follows: for the Publisher, execute sp_adjustpublisheridentityrange; for the Subscriber, run the Distribution Agent or the Merge Agent.
The statement has been terminated.
检查表上的约束,在我看来,在遇到问题之前,我应该能够一次插入至少1000行。但是,我在尝试插入几十行时也会遇到同样的错误
以下是我尝试插入数据的方式:
insert into NODE_ATTRIB_RSLT
([NODE_ID]
,[ATTRIB_ID]
,[STATE_ID]
,[PLAN_REVISION_ID]
,[TIMESTAMP]
,[VALUE]
,[VALUE_TEXT]
,[LAST_MODIFIED])
SELECT [NODE_ID]
,[ATTRIB_ID]
,[STATE_ID]
,[PLAN_REVISION_ID]
,[TIMESTAMP]
,[VALUE]
,[VALUE_TEXT]
,[LAST_MODIFIED] FROM [NODE_ATTRIB_RSLT_TEMP]
PK列是一个名为ID的自动生成标识。为了尝试一次插入更少的行,我在select like so的末尾添加了WHERE子句:
WHERE ID >= 1000 and ID <1100
其中ID>=1000,ID我想我已经解决了问题所在
查看复制表的属性,发布者的标准默认标识范围为10000,订阅者的默认标识范围为1000
但是,检查实际表上的标识约束(使用SP_HELPCONSTRAINT‘node_attrib_rslt’)发现两台服务器上只有1000个ID池。这使得大容量插入失败,即使我限制了要插入的行数——我猜SQL Server在运行插入时检查约束时也没有做到这一点
为了修复它,我必须做几件事:
更改表的标识范围。我为出版者和订阅者都设置了20K。
在发布服务器上,展开复制-->本地发布
右键单击特定订阅并选择“属性”
选择文章页面
突出显示相应的表格
单击文章属性“按钮”,然后选择“设置突出显示表格文章的属性”
在“文章属性”窗口中,查找标识范围管理选项
更改适当的值
在对话框窗口中按OK和OK
在发布服务器上运行sp_adjustpublisheridentityrange存储过程。
服务器上的新查询窗口
选择正确的数据库
执行sp_adjustpublisheridentityrange@table_name='node_attrib_rslt'
从subcriber,强制同步服务器。
在订阅服务器上,展开复制-->本地子脚本
右键单击特定订阅并选择“查看订阅状态”
在出现的对话框中,按监视器按钮
在出现的复制监视器窗口中,展开左侧窗格中的特定发布服务器
单击要编辑的子描述
在右侧窗格中,右键单击子描述状态并选择开始同步
当它执行其操作时,状态应更新为“同步”李>
完成后,单击“警告和代理”选项卡。我在下面的窗格中列出了一个“快照代理”。右键单击该代理并启动它。运行一段时间后,服务器上属性的更改应该迁移到客户端
可能:在表中插入一些测试行。
编辑:最近我不得不再次执行此任务,直到我向表中插入了一组虚拟数据以耗尽默认约束,表上的约束才会更新。然后我重新同步服务器,并将约束更新为新值
之后,检查身份约束发现,我最终在出版商和订阅人上都有一个20K的ID范围可供插入。我遇到了完全相同的问题,上述解决方案对我没有任何帮助。
相反,最终解决问题的方法是在发布中的表上设置新的、更大的标识范围,然后删除表上的标识约束
最后运行这个命令来设置当前标识
DBCC CHECKIDENT ('TableName', RESEED, 1000000000);
不再将该值设置为100000000,而是再次创建约束,并将其设置为发布中表上当前指定的正确标识范围值。
看起来CHECKIDENT命令强制以某种方式更新约束
上面的解决方案对我来说很有效,但实际上我只是尝试删除约束,并将发布服务器和订阅服务器设置为使用不同的标识范围,以便它们能够在表中插入行。幸运的是,CHECKIDENT似乎刷新了约束,这是我最初期望sp_adjustpublisheridentityrange存储过程要做的事情——只是它什么也没做
我在发布服务器和订阅服务器上都运行了上述命令。我不同意此解决方案,这一点也没有帮助,实际上这已将标识值更改为100000000,约束条件保持不变。