指定合并复制属性

适用于SQL Server

本主题说明如何为合并复制指定各种属性。

合并文章仅可下载

仅用于下载的项目是为具有不在订阅服务器上更新的数据的应用程序设计的。 有关详细信息,请参阅使用仅下载项目优化合并复制性能

注意事项

  • 如果在初始化订阅后指定项目仅用于下载,则所有收到该项目的客户端订阅必须重新初始化。 服务器订阅不必重新初始化。 有关属性更改的影响的详细信息,请参阅更改发布和项目属性

使用 SQL Server Management Studio

在“文章”页面上

在新建发布向导的 “文章” 页面上,选择一个表,然后选中复选框 “高亮显示的表仅用于下载”

在“文章属性”的“属性”选项卡上

  1. 在新建发布向导的“项目”页或“发布属性 - <发布>”对话框中,选择一个表,然后单击“项目属性”

  2. 单击 “设置突出显示的表项目的属性”“设置所有表项目的属性”

  3. 在“项目属性 - 项目”<对话框的“属性”>选项卡的“目标对象”部分中,为“同步方向”指定以下值之一:

    • 下载到订阅服务器,禁止订阅服务器更改
    • 下载到订阅服务器,并允许在订阅服务器上进行更改
  4. 如果处于“发布属性 - <发布>”对话框中,请单击“确定”以保存并关闭该对话框。

使用 Transact-SQL

新文章

  1. 执行 sp_addmergearticle,为参数 指定 1 值或 2 值@subscriber_upload_options。 这些数字分别与以下行为相对应:

    • 0 - 无限制(默认值)。 在订阅服务器端所做的更改将上传到发布服务器。
    • 1 - 允许在订阅服务器上进行更改,但不会将它们上载到发布服务器。
    • 2 - 不允许在订阅者端进行更改。

    注意

    如果某个项目的源表已经在另一个发布中发布,则两个项目的 @subscriber_upload_options 值必须相同。

现有文章

  1. 要确定项目是否仅用于下载,请执行 sp_helpmergearticle,并验证结果集中项目“upload_options”的值

  2. 如果在步骤 1 中返回的值为 0,则执行 sp_changemergearticle,为参数 指定值 subscriber_upload_options@property,为 @force_invalidate_snapshot 指定值 1@force_reinit_subscription,并为 指定值 1 或 2,这里的数字分别对应于以下行为@value

    • 1 - 允许在订阅服务器上进行更改,但不会将它们上载到发布服务器。

    • 2 - 不允许在订阅者端进行更改。

      注意

      如果某篇文章的源表已经在另一出版物中发布,则这两篇文章必须采用相同的仅可下载设置。

交互式冲突解决

Microsoft SQL Server 复制提供交互式冲突解决程序,可用于在 Microsoft Windows 同步管理器中按需同步期间手动解决冲突。 启用交互式冲突解决方法后,在同步过程中即可使用交互式冲突解决程序来交互式解决冲突。 交互式冲突解决程序可以通过 Microsoft Windows 同步管理器获取。 有关详细信息,请参阅使用 Windows 同步管理器同步订阅(Windows 同步管理器)

建议

  • 如果在 Windows 同步管理器以外执行同步(如 SQL Server Management Studio 或复制监视器中的计划同步或按需同步),则会使用为项目指定的默认冲突解决方法自动解决冲突,而无需用户干预。 有关详细信息,请参阅 Interactive Conflict Resolution

使用 SQL Server Management Studio

为文章启用交互式冲突解决

  1. 在新建发布向导的“项目”页或“发布属性 - <发布>”对话框中,选择一个表。 有关如何使用该向导和如何访问该对话框的详细信息,请参阅创建发布查看和修改发布属性
  2. 单击 “项目属性”,然后单击 “设置突出显示的表项目的属性”“设置所有表项目的属性”
  3. “文章属性 - <文章>”“文章属性 - <文章类型>” 页面上,单击 Resolver 选项卡。
  4. 选择 “允许订阅服务器在按需同步时交互式解决冲突”
  5. 选择“确定”
  6. 如果处于“发布属性 - <发布>”对话框中,请单击“确定”以保存并关闭该对话框。

指定订阅应使用交互式冲突解决方法

  1. 在“订阅属性 - <订阅服务器>:订阅数据库 <”>对话框中,为“交互式解决冲突”选项指定值为“True”。 有关访问此对话框的详细信息,请参阅 View and Modify Push Subscription PropertiesView and Modify Pull Subscription Properties
  2. 选择“确定”

使用 Transact-SQL

在创建对合并发布的请求订阅时,您可以以编程方式指定订阅服务器使用此图形界面来解决项目冲突。 只有支持此选项的项目中的冲突才会显示在交互式冲突解决程序中。

创建使用交互式冲突解决程序的合并请求订阅

  1. 在发布服务器上的发布数据库中,执行 sp_helpmergearticle,并指定 @publication。 请注意结果集中每个将使用交互式解析器的条目的 allow_interactive_resolver 值。
    • 如果该值为 1,将使用交互式冲突解决程序。
    • 如果该值为 0,则您必须首先启用每个项目的交互式冲突解决程序。 为此,请执行 sp_changemergearticle,指定 @publication@article,将 @property 的值指定为 allow_interactive_resolver,并将 @value 的值指定为 true
  2. 在订阅服务器上的订阅数据库中,执行 sp_addmergepullsubscription。 有关详细信息,请参阅 创建请求订阅
  3. 在订阅数据库中的订阅服务器上,执行 sp_addmergepullsubscription_agent,同时指定下列参数:
    • @publisher@publisher_db(已发布的数据库)和 @publication
    • @enabled_for_syncmgr 的值为 true
    • @use_interactive_resolver 的值为 true
    • 合并代理所需的安全帐户信息。 有关详细信息,请参阅 创建请求订阅
  4. 在发布服务器上的发布数据库中,执行 sp_addmergesubscription

定义一个支持交互式解析程序的条目

  1. 在发布服务器的发布数据库中,执行 sp_addmergearticle。 为 @publication 指定该文章所属发布的名称,为 @article 指定文章名称,为 @source_object 指定要发布的数据库对象,并为 @allow_interactive_resolver 指定 true 值。 有关详细信息,请参阅 定义项目

合并项目的冲突跟踪和解决级别

本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中为合并项目指定冲突跟踪和解决级别。

在同步对合并发布的订阅时,复制检查是否存在因对发布服务器和订阅服务器上的相同数据进行更改而导致的冲突。 可以指定是在行级别检测冲突(即对行的任何更改都视为冲突),还是在列级别检测冲突(即只有更改了相同的行和列时才视作冲突)。 针对文章的冲突解决是在行级进行的。 有关在使用逻辑记录时检测和解决冲突的详细信息,请参阅 Detecting and Resolving Conflicts in Logical Records

限制和局限

  • 如果在初始化订阅后修改跟踪级别,必须重新初始化这些订阅。 有关属性更改的影响的详细信息,请参阅更改发布和项目属性
  • 对于行级和列级跟踪,冲突解决始终在行级执行:胜出的行会覆盖失败的行。 合并复制还允许你指定在逻辑记录级别跟踪和解决冲突,但这些选项无法通过 SQL Server Management Studio 使用。 有关在复制存储过程中设置这些选项的信息,请参阅 定义合并表项目间的逻辑记录关系

使用 SQL Server Management Studio

项目属性 对话框的 属性 选项卡上,指定合并项目的行级或列级跟踪。该对话框可在“新建发布向导”和“发布属性 - <发布>”对话框中使用。 有关如何使用该向导和如何访问该对话框的详细信息,请参阅创建发布查看和修改发布属性

指定行级别或列级别跟踪

  1. 在新建发布向导的“项目”页或“发布属性 - <发布>”对话框中,选择一个表。
  2. 单击 “项目属性”,然后单击 “设置突出显示的表项目的属性”“设置所有表项目的属性”
  3. 在“项目属性 项目<”>对话框的“属性”选项卡上,为“跟踪级别”属性选择以下值之一:“行级跟踪”或“列级跟踪”
  4. 如果处于“发布属性 - <发布>”对话框中,请单击“确定”以保存并关闭该对话框。

使用 Transact-SQL

为新的合并项目指定冲突跟踪选项

  1. 在发布服务器上的发布数据库中,执行 sp_addmergearticle,并为 @column_tracking 指定下列值之一:

    • true - 对文章使用列级跟踪。
    • false - 使用行级别跟踪,这是默认值。

更改合并项目的冲突跟踪选项

  1. 若要确定某个合并项目的冲突跟踪选项,请执行 sp_helpmergearticle。 请注意该文章结果集中的 column_tracking 选项值。 值为 1 表明使用的是列级别的跟踪,值为 0 表明使用的是行级别的跟踪。

  2. 在发布服务器上的发布数据库中,执行 sp_changemergearticle。 为 @property 指定 column_tracking 的值,并为 @value 指定以下值之一:

    • true - 为文章使用列级跟踪。
    • false - 使用行级别跟踪,这是默认值。

    @force_invalidate_snapshot@force_reinit_subscription 的值都指定为 1

管理跟踪删除操作

注意

在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

默认情况下,合并复制会同步发布服务器与订阅服务器之间的DELETE命令。 您可以使用合并复制来保留订阅数据库中的行,即使这些行已从发布中删除,反之亦然。 可以通过编程指定在创建新项目时忽略 DELETE 命令,也可以在稍后使用复制存储过程启用此功能。

重要

启用此功能将导致非收敛,这意味着订阅服务器中的数据将无法准确反映发布服务器中的数据。 您必须实现自己的用于手动删除已删除行的机制。

指定对新合并项目忽略删除操作

在发布数据库中的发布服务器上,执行 sp_addmergearticle (Transact-SQL)。 将 @delete_tracking 的值指定为 false。 有关详细信息,请参阅 定义项目

注意

如果某个项目的源表已在另一个发布中发布,则两个项目的 delete_tracking 值必须相同。

指定对现有合并项目忽略删除

  1. 要确定是否已为某个项目启用错误补偿,请执行 sp_helpmergearticle (Transact-SQL),并查看结果集中的 delete_tracking 值。 如果该值为 0,则删除已被忽略。

  2. 如果步骤 1 中的值为 1,则在发布服务器上的发布数据库中执行 sp_changemergearticle (Transact-SQL)。 将 @property 的值指定为 delete_tracking,并将 @value 的值指定为 false

    注意

    如果某个项目的源表已在另一个发布中发布,则两个项目的 delete_tracking 值必须相同。

处理顺序

合并复制允许您指定在同步过程中合并代理处理各项目的顺序。 您可以在使用复制存储过程创建项目时以编程方式为每个项目指定顺序。 条目按照值从低到高的顺序处理。 如果两个项目具有相同值,将对其进行并发处理。

如何确定处理顺序

合并同步过程中,项目在默认情况下按照对象间相关性要求的顺序处理,包括基表中定义的声明性引用完整性 (DRI) 约束。 处理涉及将更改枚举到表,然后应用这些更改。 若不存在 DRI,但在表项目之间存在联接筛选器或逻辑记录,则就以筛选器和逻辑记录要求的顺序处理项目。 未通过 DRI、联接筛选器、逻辑记录或其他依赖关系与任何其他项目相关联的项目,将根据 sysmergearticles (Transact-SQL) 系统表中的项目别名进行处理。

考虑一个包含 SalesOrderHeader 表和 SalesOrderDetail 表的发布,并且 SalesOrderHeader 表中具有主键列 SalesOrderIDSalesOrderDetail 表中具有对应的外键列 SalesOrderID 。 同步过程中,合并复制会先将任何新行插入 SalesOrderHeader,然后再插入 SalesOrderDetail 中的相关行,以防止违反外键约束。 同样,要先从 SalesOrderDetail 中删除行,然后才从 SalesOrderHeader中删除相关行。

但是,在某些应用程序中,引用完整性是通过数据库触发器或在应用程序层面强制执行的,而不是通过 DRI。 对于上述发布中描述的情况,不使用 DRI 时,可以在 SalesOrderDetail 表上设置一个插入触发器,以确保 SalesOrderHeader 表中存在对应的行,然后才允许插入。 SalesOrderHeader 可能有一个删除触发器以确保在允许删除之前 SalesOrderDetail 中没有相关行。 由于合并复制在触发器触发之前无法确定触发器会产生什么结果,因此在确定复制项目的处理顺序时,不会考虑触发器。 同样,复制也不会考虑在应用程序级定义的约束。

通过触发器或在应用程序级维护引用完整性时,您应该指定项目应处理的顺序。 在有关触发器的示例中,需要指定在处理 SalesOrderDetail 之前先处理 SalesOrderHeader表,因为项目排序是根据插入顺序进行的。 合并复制会自动反转删除顺序。 不进行项目排序也不会导致合并复制失败,因为即使违反约束,合并代理也会继续处理项目;然后它会在处理完其他项目后重试所有过去失败的操作。 指定条目顺序只是为了避免重试及其相关的额外处理。 如果指定了错误顺序(比如,导致详细记录在标题记录前处理的顺序),合并复制会重试处理直到成功。

新文章

  1. 在发布数据库中的发布服务器上,执行 sp_addmergearticle (Transact-SQL)。 为 @processing_order 指定一个表示此项目处理顺序的整数值。 有关详细信息,请参阅 定义项目

    注意

    创建指定了顺序的项目时,应在项目顺序值之间留有间隔。 这样便于以后设置新值。 例如,如果需要为三个项目指定固定处理顺序,则应将 @processing_order 的值分别设置为 10、20 和 30,而不是 1、2 和 3。

现有文章

  1. 要确定项目的处理顺序,请执行 sp_helpmergearticle (Transact-SQL),并记下结果集中的 processing_order 值。
  2. 在发布服务器上的发布数据库中,执行 sp_changemergearticle (Transact-SQL)。 为 指定值 processing_order@property,并为 @value 指定一个表示处理顺序的整数值。