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],[LAST_MODIFIED] FROM [NODE_ATTRIB_RSLT_TEMP]
PK列是称为ID的自动生成身份.为了一次插入更少的行,我已经在选择结尾添加了一个WHERE子句,就像这样:
WHERE ID >= 1000 and ID <1100
但无济于事
在发布服务器上运行sp_adjustpublisheridentityrange成功执行,但不起作用.
解决方法
查看复制表的属性,Publisher的标准默认标识范围为10000,Subcriber的标准默认标识范围为1000.
但是,检查实际表上的身份约束(使用SP_HELPCONSTRAINT’node_attrib_rslt’)显示,两台服务器上只有一个1000个ID池.这使得批量插入失败,即使我限制要插入的行数 – 我猜,当运行INSERT INTO检查约束时,sql Server甚至不会那么远.
要解决它,我不得不做几件事情:
更改表的身份范围.发布者和子公司都将其设置为20K.
>在发布服务器上,展开复制 – >本地刊物
>右键单击特定的订阅并选择“属性”.
>选择文章页面.
>突出显示相应的表.
>点击文章属性按钮,然后选择“设置突出显示的表属性”.
>在“文章属性”窗口中,查找“身份范围管理”选项.
>更改适当的值.
>在对话框窗口中按OK并确定.
在发布服务器上运行sp_adjustpublisheridentityrange存储过程.
>服务器上的新查询窗口
>选择正确的数据库
>执行sp_adjustpublisheridentityrange @table_name =’node_attrib_rslt’
从子对象,强制同步服务器.
>在订阅服务器上,展开复制 – >本地子表
>右键单击特定订阅并选择查看订阅状态.
>在出现的对话框中,按显示器按钮.
>在出现的“复制监视器”窗口中,展开左侧窗格中的特定“发布者”.
>点击Subcription进行编辑.
>在右侧窗格中,右键单击子句状态,然后选择“开始同步”.
>状态应该更新为“同步”,而它做它的事情.
>完成后,单击“警告和代理”选项卡.我在下面的窗格中列出了一个“快照代理”.右键单击该代理并启动它.运行一段时间后,服务器上的属性更改应已迁移到客户端.
也许:在表中插入一些测试行.
编辑:我最近不得不重新执行这个任务,并且表中的约束不会更新,直到我将一堆虚拟数据插入到表中,以耗尽默认约束.然后我重新同步服务器,并将约束更新为新值.