sql-server – 插入复制表失败 – 身份范围检查

前端之家收集整理的这篇文章主要介绍了sql-server – 插入复制表失败 – 身份范围检查前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在数据库中的表中插入数千行,这两个数据库是跨两个服务器复制的.从发布商或订阅者,我得到相同的错误
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成功执行,但不起作用.

如何解决插入问题?
如何在保持复制运行的同时将indentity范围的范围修改为更合理的级别?

解决方法

我想我已经解决了什么问题.

查看复制表的属性,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进行编辑.
>在右侧窗格中,右键单击子句状态,然后选择“开始同步”.
>状态应该更新为“同步”,而它做它的事情.
>完成后,单击“警告和代理”选项卡.我在下面的窗格中列出了一个“快照代理”.右键单击该代理并启动它.运行一段时间后,服务器上的属性更改应已迁移到客户端.

也许:在表中插入一些测试行.

编辑:我最近不得不重新执行这个任务,并且表中的约束不会更新,直到我将一堆虚拟数据插入到表中,以耗尽默认约束.然后我重新同步服务器,并将约束更新为新值.

之后,检查身份约束显示,我终于有一个20K的ID范围插入与发布者和分类器.

猜你在找的MsSQL相关文章