指定合并复制属性

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

仅下载

本部分介绍如何使用 SQL Server Management Studio 或 Transact-SQL 将合并表文章指定为仅用于下载的项目,以便在 SQL Server 2014 中使用。 仅下载文章专为未在订阅服务器上更新的数据的应用程序而设计。 有关详细信息,请参阅使用仅下载项目优化合并复制性能

局限性与限制

  • 如果在初始化订阅后指定某篇文章仅供下载,则必须重新初始化所有接收到该文章的客户端订阅。 服务器订阅不必重新初始化。 有关属性更改效果的详细信息,请参阅 “更改发布”和“项目属性”。

使用 SQL Server Management Studio

指定文章为仅下载类型,可以在“新建发布向导”的“文章”页或“文章属性 - <文章>”对话框的“属性”选项卡上进行设置。 此对话框在“新建发布向导”和“ 发布属性 - <发布> ”对话框中可用。 有关使用向导和访问对话框的详细信息,请参阅 创建发布查看和修改发布属性

要在“文章”页上将文章指定为仅限下载

  • 在“新建发布向导”的“文章”页上选择一个表,然后选择“高亮显示的表格仅限下载”复选框。

若要在“文章属性 - <文章>”对话框的“属性”选项卡上指定文章为仅供下载

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

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

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

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

使用 Transact-SQL

指定新的合并表文章为仅下载型态

  1. 执行sp_addmergearticle,为参数@subscriber_upload_options指定值 12。 这些数字对应于以下行为:

    • 0 - 无限制(默认值)。 在订阅服务器上所做的更改将上传到发布服务器。

    • 1 - 订阅服务器上允许更改,但不会上传到发布服务器。

    • 2 - 订阅服务器上不允许更改。

      注释

      如果文章的来源表已经在另一份出版物中发布,两篇文章的@subscriber_upload_options的值必须相同。

修改现有合并表文章以设置为仅下载

  1. 若要确定项目是否仅下载,请执行 sp_helpmergearticle。 请注意结果集中文章 upload_options 的值。

  2. 如果步骤 1 中返回的值为 0,则执行 sp_changemergearticle,指定 @property 的值为 subscriber_upload_options@force_invalidate_snapshot@force_reinit_subscription 的值为 1,以及 @value 的值为 12,该值对应于以下行为:

    • 1 - 订阅服务器上允许更改,但不会上传到发布服务器。

    • 2 - 订阅服务器上不允许更改。

      注释

      如果用于文章的源表已经在其他出版物中发布,两篇文章的下载行为必须相同。

交互式冲突解决

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

建议

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

使用 SQL Server Management Studio

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

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

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

  1. “订阅属性 - <订阅服务器>: <SubscriptionDatabase>”对话框中,为“以交互方式解决冲突”选项指定 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

定义支持交互式冲突解决程序的文章

在发布者处,在发布数据库上执行 sp_addmergearticle。 指定文章所属出版物的名称为@publication,文章的名称为@article,要发布的数据库对象为@source_object,以及@allow_interactive_resolver的值为true。 有关详细信息,请参阅 定义项目

指定冲突跟踪和解决级别

当合并发布的订阅进行同步时,复制进程会检查发布服务器和订阅服务器上对相同数据的更改所引发的冲突。 可以指定是否在行级别检测到冲突,其中对行的任何更改都被视为冲突,或者列级别,其中仅对同一行和列的更改被视为冲突。 文章的冲突解决在行级别执行。 有关使用逻辑记录时冲突检测和解决的详细信息,请参阅 检测和解决逻辑记录中的冲突

局限性与限制

  • 如果在初始化订阅后修改跟踪级别,则必须重新初始化这些订阅。 有关属性更改效果的详细信息,请参阅 “更改发布”和“项目属性”。
  • 使用行级和列级跟踪时,冲突解决始终在行级别执行:获胜行覆盖输的行。 合并复制还允许指定在逻辑记录级别跟踪和解决冲突,但这些选项在 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

记录删除

注释

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

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

重要

启用此功能将导致数据不同步,这意味着订阅者上的数据不会准确反映发布者上的数据。 你必须实现自己的机制来手动删除不再需要的行。

指定对新合并文章忽略删除操作

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

    注释

    如果某个文章的源表已在其他出版物中发布,则这两篇文章的 delete_tracking值必须相同。

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

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

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

    注释

    如果文章的源表已在另一份出版物中发布,则两篇文章的 delete_tracking 的值必须相同。

处理顺序

通过合并复制,可以指定合并代理在同步过程中处理项目的顺序。 使用复制存储过程创建项目时,可以编程方式为每个项目分配订单。 项目按从最低值到最高值的顺序进行处理。 如果两个项目具有相同值,将对其进行并发处理。 有关详细信息,请参阅指定合并复制属性

从 Microsoft SQL Server 2005 开始,可以替代合并发布的项目处理的默认顺序。 例如,如果通过触发器定义引用完整性,并且这些触发器必须按特定顺序触发,这非常有用。

如何确定处理顺序

在合并同步期间,项目默认按照对象之间的依赖关系所需的顺序进行处理,包括基表上定义的声明性引用完整性(DRI)约束。 处理包括列出表格中的更改并依次应用这些更改。 如果没有 DRI,但表项目之间存在联接筛选器或逻辑记录,则按照筛选器和逻辑记录所需的顺序处理项目。 根据 sysmergearticles (Transact-SQL) 系统表中的项目昵称,通过 DRI、联接筛选器、逻辑记录或其他依赖项处理与任何其他项目无关的项目。

请考虑包含表 SalesOrderHeaderSalesOrderDetail 的出版物,其中包含 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. 在Publisher的发布数据库上,执行sp_changemergearticle(Transact-SQL)。 指定@propertyprocessing_order值和表示@value处理顺序的整数值。

另请参阅

使用条件删除跟踪优化合并复制性能
检测和解决逻辑记录中的冲突
定义合并表项目间的逻辑记录关系
检测和解决合并复制冲突
使用 Download-Only 文章优化合并复制性能
定义文章
查看和修改项目属性