当您试图在 SQL Server 2005 中插入的合并复制订阅服务器上的数据时 FIX: 错误消息: 消息 548,级别 16,2,状态行 1。插入失败"

文章翻译 文章翻译
文章编号: 953481 - 查看本文应用于的产品
错误 #: 50002854 (SQL 修补程序)
Microsoft 将 Microsoft SQL Server 2005 修补程序分发作为一个可下载的文件。因为该修补程序是累积性的因此每个新版本包含的所有修补程序和所有安全修补程序附带以前 SQL Server 2005 修补都程序版本。
展开全部 | 关闭全部

本文内容

症状

请考虑以下情形。在 SQL Server 2005 中,您将配置合并发布。您添加一个包含标识列到合并发布的表。然后,将数据插入到发布服务器上的表中。在订阅服务器与发布服务器,之间数据同步,然后尝试插入发布服务器上的其他数据。在这种情况下您会收到下面的错误消息,在发布服务器上:
消息 548,级别 16 状态 2,行 1
插入失败。它标识与冲突范围检查数据库中的约束 DatabaseName,复制的表 SchemaTableNameColumnName 列。如果由复制自动管理标识列,更新范围,如下所示: 为发布服务器,执行 sp_adjustpublisheridentityrange ; 对于订阅服务器上,运行分发代理程序或合并代理程序。
如果您尝试运行该 sp_adjustpublisheridentityrange 过程存储在发布服务器上,正如错误消息中提到的您仍然无法解决此问题。

当多个合并代理在相同的合并出版物的相同时间同步数据时,就会出现此问题。如果您有许多订阅服务器对合并发布,可以将变此问题。

原因

出现此问题的原因是表在发布服务器上的当前标识值不在的标识范围检查约束标识范围内。当多个合并代理程序试图增加一次的标识范围,通过在发布服务器上创建下一次的标识范围时,就会发生此行为。

解决方案

在累积更新 8 首先释放此问题的修复程序。有关如何获取 SQL Server 2005 Service Pack 2 的此累积更新包的详细信息单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
951217对于 SQL Server 2005 Service Pack 2 的累积更新包 8
注意因为这些版本是累积性的因此每个新的修补程序版本包含的所有修补程序和所有安全修补程序附带以前 SQL Server 2005 修补都程序版本。Microsoft 建议您考虑应用最新的修补程序版本包含此修补程序。有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
937137SQL Server 2005 生成发布 SQL Server 2005 Service Pack 2 之后发布的
为特定 SQL Server 服务包创建 Microsoft SQL Server 2005 修补程序。必须将 SQL Server 2005 Service Pack 2 修补程序应用到 SQL Server 2005 Service Pack 2 的安装。默认状态下,SQL Server service pack 中提供的任何修补程序包含在下一个 SQL Server 服务包中。

替代方法

要变通解决此问题,您必须防止多个并发合并同步。要这样做将 max_concurrent_merge 属性设置在合并发布上通过运行下面的语句:
sp_changemergepublication '<PublicationName>', 'max_concurrent_merge', 1
注意 使用此解决方法后,如果您有许多订阅服务器的发布,性能可能会降低。出现此现象的原因只有一个订阅服务器可以一次同步数据。

状态

Microsoft 已经确认这是在"适用于"一节中列出的 Microsoft 产品中的问题。

更多信息

如何确定是否遇到此问题

若要确定是否遇到此问题,请按照下列步骤操作:
  1. 验证当前标识值小于第一个标识区域的标识范围检查约束的下限。

    若要获得当前标识值,运行下列语句:
    SELECT IDENT_CURRENT ('<TableName>')
    要获取的标识范围检查约束的标识范围,运行下列语句:
    语句 1
    sp_helpconstraint '<TableName>'
    语句 2
    select * from MSmerge_identity_range
    where is_pub_range <>1
    AND artid IN 
     (select artid from sysmergearticles where name='<TableName>')
    AND subid in 
     (select subid from sysmergesubscriptions  MS
    join sysmergepublications MP 
    on MS.subscriber_server=MP.publisher
    AND MS.db_name = MP.publisher_db
    WHERE name='<PublicationName>'
    )
    
  2. 使用一个 SQL Server 事件探查器跟踪以确定是否由同一发布的独立的合并代理程序会话启动交错的 sp_MSsetup_publisher_idrange 存储过程执行。

    但是,交错的执行 sp_MSsetup_publisher_idrange 存储过程不会始终指示您遇到此问题。这是因为 SQL Server 事件探查器未运行时,原始出现的合并同步生成第一个错误消息。 然而,交错的执行 sp_MSsetup_publisher_idrange 存储过程的增加遇到此问题的可能性。
  3. 您可以找到重叠发生在收到时出现"548"错误消息的合并同步。若要这样做,您可以检查合并历史记录在分发数据库中。 若要执行此操作运行下列语句:
    Use distribution
    GO
    select session_id, agent_id, B.publication, min(time) as StartTime, max(time) as EndTime
    into #sessiontimes
    from dbo.MSmerge_history A
    join dbo.msmerge_agents B
    on A.agent_id = B.id
    group by session_id, agent_id, publication
    order by 3 desc
    GO
    -- The left side result is the original session. The right side result is the overlapping session.
    select A.*, B.* 
    from #sessiontimes A
    Join #sessiontimes B
    On B.StartTime >= A.StartTime
    AND B.StartTime <= A.EndTime
    AND A.session_id <> B.session_id
    And A.publication=B.publication
    Order By A.StartTime asc
    GO
    drop table #sessiontimes
    

如何更正现有损坏有问题的表的标识范围

安装累积更新后或在解决办法部分中使用介绍该方法后,不会更正一个表中现有的已损坏的标识范围。如果您尝试将插入到表中的数据和同步在订阅服务器上的数据,您仍将收到"548"错误消息。因此,您必须手动更正为表已损坏的标识范围。若要这样做,请按照下列步骤。

注意这些步骤涉及到手动重写当前标识种子值的表以正确地更新在发布服务器上的标识值。在已损坏的状态当前标识值小于第一个的标识范围,在合并复制的标识范围检查约束中。该步骤手动引发到由合并复制的标识范围检查约束定义的标识范围内属于标识值。这些步骤都假定以升序方式配置的身份和标识增量被配置为增加值为 1。
  1. 确认标识增量值是 1 和标识继续以升序方式。您可以通过在发布服务器上运行以下语句来获取标识增量值:
    SELECT IDENT_INCR( '<TableName>')
  2. 若要查找有问题的标识列上的当前标识值在发布服务器上运行下列语句:
    DBCC CHECKIDENT ('<TableName>')
    收到结果后,请注意后续步骤中的比较在 当前标识值 的值。请注意 当前列的值 valye 可能更大或小于 当前标识值 的值。

    当前标识值 值大于 当前列的值 的值是否该列的值以及可能会有其他的复制拓扑中在发起与发布服务器复制成功合并。小于 当前标识值当前列的值 的值是否值可能已插入发布服务器上较早的时间在通过使用 SET IDENTITY_INSERT ON,在合并复制配置之前的语句。
  3. 若要确定当前的标识范围的标识范围检查约束的有问题的表在发布服务器上运行下列语句:
    Use <PublishedDatabaseName>
    GO
    sp_helpconstraint '<TableName>'
    GO
    
    收到结果后,请注意其中 constraint_name 列的值是"repl_identity_range_ GUID 记录的 constraint_keys 列的值。GUID 值对应于 sysmergearticles 系统表中一文 artid 列的值。若要获得该 GUID,运行下列语句: 从 sysmergearticles
    select artid from sysmergearticles where name = '<TableName>'
    标识范围检查约束跨越两个单独的范围。不必是连续的两个集的范围。例如对于 constraint_keys 列的值可以如下所示:
    ([ColumnName] > (1001) 和 [ColumnName]<=(2001)
    OR [ColumnName] > (9001) 和 [ColumnName]<=(10001))
    注意本文使用本示例向代码中剩余的步骤。

    在此的示例中每个范围跨越 1,000 的值。默认范围大小为 1,000。 但是,您可以使用下列方法之一更改标识范围大小:
    • 指定 @ pub_identity_range 参数在运行该 sp_addmergearticle 时存储过程。
    • 更改项目在 项目属性 对话框中的 订阅服务器范围大小 属性。
  4. 如果您在遇到"症状"部分中描述的问题在第 2 步中记下的当前标识值应该小于的标识范围检查约束在步骤 3 中记下的第一个标识范围的下限。

    如果在步骤 2 中的当前标识值大于第二个的标识范围上限的标识范围检查约束,通过使用错误消息中推荐的方法解决该问题。因此,您应该运行 sp_adjustpublisheridentityrange 存储过程在发布服务器上。

    有关 sp_adjustpublisheridentityrange 存储过程的详细信息,请访问下面的 Microsoft 开发人员网络 (MSDN) 的网站:
    http://msdn.microsoft.com/en-us/library/ms181527.aspx
  5. 运行下列语句,以决定是否在当前的标识范围,标识范围检查约束的任何行:
    SELECT COUNT(*) FROM TableName WHERE 
    ([ColumnName]>(1001) AND [ColumnName]<=(2001) 
    OR [ColumnName]>(9001) AND [ColumnName]<=(10001))
    
    笔记
    • 如果该语句返回 0,没有行是在当前的标识范围。在这种情况下,请转到步骤 6。
    • 如果该语句返回一个值,该值是大于 0,运行以下语句来获取当前的标识范围中最大标识值:
      SELECT MAX(ColumnName) as MaxValue FROM TableName WHERE 
      ([ColumnName]>(1001) AND [ColumnName]<=(2001) OR 
      [ColumnName]>(9001) AND [ColumnName]<=(10001))
      
      注意返回的值,然后转至步骤 7。
  6. 手动更新有问题要在有效范围内属于表的当前标识。

    更新当前标识的当前标识范围加 1 最小值。 例如对于如果当前的标识范围的最小值为 1001年,第一个可能的范围中值是 1002年因为低端的标识范围检查约束的范围内使用大于号 (&gt;)。要做到这点,在发布服务器上, 运行下列语句然后转到步骤 8:
    DBCC CHECKIDENT ('TableName', RESEED, 1002)
  7. 手动更新有问题要在有效范围内属于表的当前标识。

    假定标识增量为 1。更新当前标识为在步骤 5 中, 记下的值,然后添加 1。例如对于如果在第 5 步中记下的值为 1507年,更新以 1508年当前标识。若要执行此操作在发布服务器上运行下列语句:
    DBCC CHECKIDENT ('TableName', RESEED, 1508)
  8. 执行测试,以确定是否可以无错误 548 发生到发布服务器数据库中表插入新行。
有关哪些文件发生更改的详细信息,并应用累积更新包包含此 Microsoft 知识库文章中描述的修补程序的任何系统必备项有关的信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
951217对于 SQL Server 2005 Service Pack 2 的累积更新包 8

参考

有关列表后 SQL Server Service Pack 2 的可用版本的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
937137SQL Server 2005 生成发布 SQL Server 2005 Service Pack 2 之后发布的
对于 SQL Server 增量的服务模型的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
935897一个增量的服务模型是可从 SQL Server 团队提供报告的问题的修补程序
有关如何获取 SQL Server 2005 Service Pack 2 的详细信息单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
913089如何获取最新的 service pack,SQL Server 2005 年
有关新功能和 SQL Server 2005 Service Pack 2 中的改进的详细信息请访问下面的 Microsoft 网站:
http://go.microsoft.com/fwlink/?LinkId=71711
有关命名架构的详细信息,对于 SQL Server 更新,单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
822499Microsoft SQL Server 软件更新程序包的新命名架构
有关软件更新术语的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
824684用于描述 Microsoft 软件更新的标准术语的说明

属性

文章编号: 953481 - 最后修改: 2008年7月11日 - 修订: 1.0
这篇文章中的信息适用于:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
  • Microsoft SQL Server 2005 Standard X64 Edition
  • Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Enterprise X64 Edition
  • Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems
  • Microsoft SQL 2005 Server Workgroup
关键字:?
kbmt kbhotfixrollup kbfix kbpubtypekc kbqfe kbexpertiseadvanced kbhotfixserver kbautohotfix kbsql2005repl KB953481 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 953481
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com