你的位置:首页 > 软件开发 > 数据库 > SQL Server 合并复制遇到identity range check报错的解决

SQL Server 合并复制遇到identity range check报错的解决

发布时间:2015-09-02 17:00:23
最近帮一个客户搭建跨洋的合并复制,由于数据库非常大,跨洋网络条件不稳定,因此只能通过备份初始化,在初始化完成后向海外订阅端插入数据时发现报出如下错误: Msg 548, Level 16, State 2, Line 2 The insert failed. It confli ...

    最近帮一个客户搭建跨洋的合并复制,由于数据库非常大,跨洋网络条件不稳定,因此只能通过备份初始化,在初始化完成后向海外订阅端插入数据时发现报出如下错误:

Msg 548, Level 16, State 2, Line 2

 

    此时我们对创建合并复制,并把该表包含在内,并使用快照代理初始化复制,当完成该步骤时,我们发现该表上自动多了两个约束,如图1所示。

SQL Server 合并复制遇到identity range check报错的解决

图1.合并复制所加的约束

    

     我们看到该约束的定义只允许4002到5002以及5002到6002之间的数据**入。

     此时如果出现了一些BUG或者人为改动了该表自增列种子的值,则会报错,如图2所示。

SQL Server 合并复制遇到identity range check报错的解决

图2.改动种子值导致插入数据出错

 

    该约束会由合并代理自动递增,比如说我们用如下代码插入2000条数据,则发现该约束会自动递增如图3所示。

DECLARE @index INT=1
WHILE @index<2000
BEGIN
INSERT INTO table_1(c2,ROWGUID) VALUES(2,NEWID())
SET @index=@index+1
END

  

SQL Server 合并复制遇到identity range check报错的解决

   图3.约束区间自动递增滑动

 

解决办法  

    此时我已经找出了上面报错的原因,因为是由于从备份初始化,那么备份以及备份传输期间发布库又有新的数据插入,此时发布库比如说,该表的种子大小已经增加到了6000,而备份中该表大小还是5000,而约束已经滑动到了6000,那么在订阅端插入数据时就会发生这种问题。

解决办法1

    在发布端使用sp_adjustpublisheridentityrange 存储过程使得约束范围自动向后滑动,比如从6000-8000滑动到8000-10000。缺点自增值之间会有一个GAP。如果业务允许,推荐使用该做法。

    sp_adjustpublisheridentityrange @table_name=’表名称‘

解决办法2

    在发布端运行SELECT  IDENT_CURRENT('表名称'),找到发布表的种子值。在订阅端通过DBCC CHECKIDENT (表名称,RESEED, 设置为上面值)命令将两端种子值设置为一致。

解决办法3

    在订阅端运行合并代理,即可修复数据。如果此方法不行,则再次尝试上述方法。

解决办法4

    不用自增列,而使用GUID列,但这涉及到表结构以及程序的修改,而且需要重新初始化复制,因此不是每一个环境都有条件这么做。

   

此时,就可以正常插入数据了。


 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:SQL Server 合并复制遇到identity range check报错的解决

关键词:sql

sql
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。