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,约束条件保持不变。