sp_changemergearticle (Transact-SQL)

更改合并项目的属性。 此存储过程是在发布服务器上对发布数据库执行的。

主题链接图标 Transact-SQL 语法约定

语法

sp_changemergearticle [ @publication = ] 'publication' 
        , [ @article = ] 'article'
    [ , [ @property = ] 'property' ]
    [ , [ @value = ] 'value' ]
    [ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
    [ , [ @force_reinit_subscription = ] force_reinit_subscription ]

参数

  • [ @publication=] 'publication'
    包含该项目的发布的名称。 publication 的数据类型为 sysname,无默认值。

  • [ @article=] 'article'
    要更改的项目的名称。 article 的数据类型为 sysname,无默认值。

  • [ @property=] 'property'
    给定项目和发布的要更改的属性。 property 的数据类型为 nvarchar(30),可以是下表所列值之一。

  • [ @value=] 'value'
    指定属性的新值。 value 的数据类型为 nvarchar(1000),可以是下表所列值之一。

    下表说明项目的属性和这些属性的值。

    属性

    说明

    allow_interactive_resolver

    true

    允许对项目使用交互式冲突解决程序。

     

    false

    不允许对项目使用交互式冲突解决程序。

    article_resolver

     

    项目的自定义冲突解决程序。 仅适用于表项目。

    check_permissions(位图)

    0x00

    不检查表级权限。

     

    0x10

    将订阅服务器上的 INSERT 语句应用于发布服务器之前,要在发布服务器上检查表级权限。

     

    0x20

    将订阅服务器上的 UPDATE 语句应用于发布服务器之前,要在发布服务器上检查表级权限。

     

    0x40

    将订阅服务器上的 DELETE 语句应用于发布服务器之前,要在发布服务器上检查表级权限。

    column_tracking

    True

    打开列级跟踪。 仅适用于表项目。

    备注

    当发布超过 246 列的表时,列级跟踪无法使用。

     

    false

    关闭列级跟踪,保留行级冲突检测。 仅适用于表项目。

    compensate_for_errors

    true

    同步过程中发生错误时执行补救措施。 有关详细信息,请参阅 sp_addmergearticle

     

    false

    不执行补救措施,这是默认行为。 有关详细信息,请参阅 sp_addmergearticle

    重要说明重要提示

    尽管受影响行中的数据可能会无法收敛,但是只要解决了发生的错误,就可应用更改,并且数据也会收敛。如果已在其他发布中发布了项目的源表,则两个项目的 compensate_for_errors 值必须相同。

    creation_script

     

    用于在订阅数据库中创建项目的可选项目架构脚本的路径和名称。

    delete_tracking

    True

    复制 DELETE 语句,这是默认行为。

     

    False

    不复制 DELETE 语句。

    重要说明重要提示

    delete_tracking 设置为 false 会导致无法收敛,并需要手动移除已删除的行。

    description

     

    项目的说明项。

    destination_owner

     

    订阅数据库中对象的所有者的名称(如果不是 dbo)。

    identity_range

     

    bigint 值。如果项目的 identityrangemanagementoption 设置为 autoauto_identity_range 设置为 true,则该值用于指定在分配新标识值时要使用的范围大小。 仅适用于表项目。 有关详细信息,请参阅复制标识列的“合并复制”部分。

    identityrangemanagementoption

    manual

    禁用自动标识范围管理。 使用 NOT FOR REPLICATION 标记标识列,启用手动标识范围处理。 有关详细信息,请参阅复制标识列

     

    none

    禁用所有标识范围管理。

    logical_record_level_conflict_detection

    True

    如果逻辑记录中发生了更改,则将检测到冲突。 需要将 logical_record_level_conflict_resolution 设置为 true

     

    False

    使用 column_tracking 指定的默认冲突检测。

    logical_record_level_conflict_resolution

    True

    整个入选逻辑记录覆盖落选逻辑记录。

     

    False

    入选行未被约束为逻辑记录。

    partition_options

    0

    项目的筛选是静态的,或者不为每个分区生成唯一的数据子集;也就是说, 它是一个“重叠”分区。

     

    1

    分区是重叠的,订阅服务器上执行的 DML 更新无法更改行所属的分区。

     

    2

    对项目的筛选将生成不重叠分区,但多个订阅服务器可以接收到相同的分区。

     

    3

    对项目的筛选将为每个订阅生成唯一的不重叠分区。

    > [!NOTE]
    > <P>如果指定 <STRONG>partition_options</STRONG> 的值为 <STRONG>3</STRONG>,则该项目中每个数据分区只能有一个订阅。如果创建了另一个订阅,而这个新订阅的筛选条件解析到的分区与现有订阅的分区相同,则会删除现有订阅。</P>
    

    pre_creation_command

    none

    如果订阅服务器上已存在该表,则不执行任何操作。

     

    delete

    根据子集筛选器中的 WHERE 子句发出 delete 命令。

     

    drop

    删除该表,然后重新创建一个表。

     

    truncate

    截断目标表。

    processing_order

     

    int 值,用于指示合并发布中项目的处理顺序。

    pub_identity_range

     

    bigint 值。如果项目的 identityrangemanagementoption 设置为 autoauto_identity_range 设置为 true,则该值用于指定分配给具有服务器订阅的订阅服务器的范围大小。 此标识范围是为重新发布订阅服务器保留的,用于分配给其自身的订阅服务器。 仅适用于表项目。 有关详细信息,请参阅复制标识列的“合并复制”部分。

    published_in_tran_pub

    True

    项目也在事务发布中发布。

     

    False

    项目不在事务发布中发布。

    resolver_info

     

    用于指定自定义冲突解决程序所需的其他信息。 某些 Microsoft 冲突解决程序需要提供列作为冲突解决程序的输入。 resolver_info 的数据类型为 nvarchar(255),默认值为 NULL。 有关详细信息,请参阅Microsoft 基于 COM 的冲突解决程序

    schema_option(位图)

    有关详细信息,请参阅本主题后面的“备注”部分。

     

    0x00

    禁用快照代理编写脚本,使用 creation_script 中提供的脚本。

     

    0x01

    生成对象创建脚本(CREATE TABLE、CREATE PROCEDURE 等)。

     

    0x10

    生成对应的聚集索引。

     

    0x20

    在订阅服务器中将用户定义数据类型转换为基本数据类型。 如果 UDT 列是主键的一部分或者计算列引用用户定义类型 (UDT) 列,则当 UDT 列上具有 CHECK 或 DEFAULT 约束时,此选项无法使用。

     

    0x40

    生成相应的非聚集索引。

     

    0x80

    包含已对主键声明的引用完整性。

     

    0x100

    如果已定义,则复制表项目的用户触发器。

     

    0x200

    复制 FOREIGN KEY 约束。 如果被引用的表不是发布的一部分,则不会复制已发布表的任何 FOREIGN KEY 约束。

     

    0x400

    复制检查约束。

     

    0x800

    复制默认值。

     

    0x1000

    复制列级排序规则。

     

    0x2000

    复制与已发布项目源对象关联的扩展属性。

     

    0x4000

    如果在表项目上定义了唯一键,则复制唯一键。

     

    0x8000

    在编写约束脚本时生成 ALTER TABLE 语句。

     

    0x10000

    以 NOT FOR REPLICATION 方式复制 CHECK 约束,以便在同步期间不强制执行约束。

     

    0x20000

    以 NOT FOR REPLICATION 方式复制 FOREIGN KEY 约束,以便在同步期间不强制执行约束。

     

    0x40000

    复制与已分区表或已分区索引相关联的文件组。

     

    0x80000

    复制已分区表的分区方案。

     

    0x100000

    复制已分区索引的分区方案。

     

    0x200000

    复制表统计信息。

     

    0x400000

    复制默认绑定。

     

    0x800000

    复制规则绑定。

     

    0x1000000

    复制全文索引。

     

    0x2000000

    不复制绑定到 xml 列的 XML 架构集合。

     

    0x4000000

    复制 xml 列的索引。

     

    0x8000000

    创建订阅服务器中尚不存在的任何架构。

     

    0x10000000

    在订阅服务器上将 xml 列转换成 ntext。

     

    0x20000000

    将在 SQL Server 2005 中引入的大型对象数据类型(nvarchar(max)、varchar(max) 和 varbinary(max))转换为 SQL Server 2000 支持的数据类型。

     

    0x40000000

    复制权限。

     

    0x80000000

    尝试删除不属于发布一部分的任何对象的依赖项。

    0x100000000

    如果对 varbinary(max) 列指定了 FILESTREAM 属性,则使用此选项可复制此属性。 如果要将表复制到 SQL Server 2005 订阅服务器,请勿指定此选项。 不论此架构选项的设置如何,均不支持将包含 FILESTREAM 列的表复制到 SQL Server 2000 订阅服务器。 请参阅相关选项 0x800000000

    0x200000000

    将在 SQL Server 2008 中引入的日期和时间数据类型(date、time、datetimeoffset 和 datetime2)转换为 SQL Server 早期版本支持的数据类型。

    0x400000000

    复制数据和索引的压缩选项。 有关详细信息,请参阅数据压缩

    0x800000000

    设置此选项可将 FILESTREAM 数据存储到订阅服务器上其自身的文件组中。 如果不设置此选项,FILESTREAM 数据将存储在默认文件组中。 由于复制操作不创建文件组,因此如果您设置此选项,您必须先创建文件组,然后在订阅服务器上应用快照。 有关如何在应用快照前创建对象的详细信息,请参阅在应用快照之前和之后执行脚本

    请参阅相关选项 0x100000000

    0x1000000000

    将公共语言运行时 (CLR) 用户定义类型 (UDT) 转换为 varbinary(max),以便类型为 UDT 的列能够复制到运行 SQL Server 2005 的订阅服务器。

    0x2000000000

    将 hierarchyid 数据类型转换为 varbinary(max),以使类型为 hierarchyid 的列能够复制到运行 SQL Server 2005 的订阅服务器。 有关如何在复制的表中使用 hierarchyid 列的详细信息,请参阅 hierarchyid (Transact-SQL)

    0x4000000000

    复制表的任何筛选的索引。 有关筛选的索引的详细信息,请参阅创建筛选索引

     

    0x8000000000

    将 geography 和 geometry 数据类型转换为 varbinary(max),以使这些类型的列能够复制到运行 SQL Server 2005 的订阅服务器。

     

    0x10000000000

    复制类型为 geography 和 geometry 的列的索引。

     

    NULL

    系统自动为项目生成一个有效的架构选项。

    status

    active

    用于发布表的初始处理脚本已运行。

     

    unsynced

    用于发布表的初始处理脚本在下一次运行快照代理时运行。

    stream_blob_columns

    True

    复制二进制大型对象列时使用数据流优化。 但是,某些合并复制功能(如逻辑记录)仍可阻止使用流优化。 启用 FILESTREAM 时,将 stream_blob_columns 设置为 true。 这使复制 FILESTREAM 数据的性能达到最佳并减少内存使用率。 若要强制 FILESTREAM 表项目不使用 blob 流式处理,请将 stream_blob_columns 设置为 false。

    重要说明重要提示

    启用此内存优化可能会在同步期间降低合并代理的性能。仅当复制包含数兆字节数据的列时,才应使用此选项。

     

    False

    复制二进制大型对象列时不使用优化。

    subscriber_upload_options

    0

    不限制在包含客户端订阅的订阅服务器上进行更新;将更改上载到发布服务器。 更改此属性可能需要重新初始化现有的订阅服务器。

     

    1

    允许在包含客户端订阅的订阅服务器上进行更改,但不将更改上载到发布服务器。

     

    2

    不允许在包含客户端订阅的订阅服务器上进行更改。

    subset_filterclause

     

    用于指定水平筛选的 WHERE 子句。 仅适用于表项目。

    重要说明重要提示

    为提高性能,建议您不要在参数化行筛选子句中对列名应用函数,如 LEFT([MyColumn]) = SUSER_SNAME()。如果在筛选子句中使用 HOST_NAME 并覆盖 HOST_NAME 值,则可能必须使用 CONVERT 转换数据类型。有关此情况的最佳实践的详细信息,请参阅参数化行筛选器中的“覆盖 HOST_NAME() 值”部分。

    threshold

     

    用于运行 SQL Server Compact 或更早版本的 SQL Server 的订阅服务器的百分比值。 threshold 控制合并代理何时分配一个新的标识范围。 如果使用了在阈值中指定的百分比值,合并代理将创建新的标识范围。 当 identityrangemanagementoption 设置为 autoauto_identity_range 设置为 true 时使用。 仅适用于表项目。 有关详细信息,请参阅复制标识列的“合并复制”部分。

    verify_resolver_signature

    1

    通过验证自定义冲突解决程序的数字签名来确定该签名是否来自可信来源。

     

    0

    不通过验证自定义冲突解决程序的数字签名来确定该签名是否来自可信来源。

    NULL(默认值)

     

    返回 property 所支持值的列表。

    • [ @force_invalidate_snapshot = ] force_invalidate_snapshot
      确认此存储过程所执行的操作是否会使现有快照失效。 force_invalidate_snapshot 数据类型为 bit,默认值为 0

      0 指定对合并项目所做的更改不会导致快照失效。 如果该存储过程检测到更改确实需要新的快照,则会发生错误,并且不进行任何更改。

      1 表示对合并项目所做的更改可能会导致快照失效,如果存在需要新快照的现有订阅,则向其授予将现有快照标记为过时并生成新快照的权限。

      有关在更改时需要生成新快照的属性,请参阅“备注”部分。

    • [ @force_reinit_subscription = ] force_reinit_subscription
      确认此存储过程所执行的操作是否需要重新初始化现有订阅。 force_reinit_subscription 的数据类型为 bit,默认值为 0

      0 指定对合并项目所做的更改不会导致重新初始化订阅。 如果该存储过程检测到更改将需要重新初始化现有订阅,则会发生错误,并且不执行任何更改。

      1 表示对合并项目的更改将导致重新初始化现有订阅,并且授予重新初始化订阅的权限。

      有关在更改时需要重新初始化所有现有订阅的属性,请参阅“备注”部分。

    返回代码值

    0(成功)或 1(失败)

    注释

    sp_changemergearticle 用于合并复制。

    由于 sp_changemergearticle 用于更改最初通过使用 sp_addmergearticle 指定的项目属性,因此请参阅 sp_addmergearticle 以了解有关这些属性的其他信息。

    更改下列属性需要生成新的快照,因而必须将 force_invalidate_snapshot 参数的值指定为 1

    • check_permissions

    • column_tracking

    • destination_owner

    • pre_creation_command

    • schema_options

    • subset_filterclause

    更改下列属性需要重新初始化现有订阅,因而必须将 force_reinit_subscription 参数的值指定为 1

    • check_permissions

    • column_tracking

    • destination_owner

    • pre_creation_command

    • identityrangemanagementoption

    • subscriber_upload_options

    • subset_filterclause

    • creation_script

    • schema_option

    • logical_record_level_conflict_detection

    • logical_record_level_conflict_resolution

    如果指定 partition_options 的值为 3,则只要运行合并代理就会清除元数据,并且分区快照会更快过期。 使用此选项时,应考虑启用订阅服务器请求的分区快照。 有关详细信息,请参阅带有参数化筛选器的合并发布的快照

    如果设置了 column_tracking 属性,并且已在其他合并发布中发布了表,则列跟踪的值必须与基于该表的现有项目使用的值相同。 此参数只适用于表项目。

    如果多个发布都根据同一个基础表发布项目,则更改项目的 delete_tracking 属性或 compensate_for_errors 属性,将导致基于同一个表的其他项目也发生相同的更改。

    如果合并进程使用的发布服务器登录名/用户帐户没有正确的表权限,则无效更改将被记录为冲突。

    更改 schema_option 的值时,系统不执行位更新。 也就是说,如果使用 sp_changemergearticle 设置 schema_option,则可能会关闭现有的位设置。 若要保留现有的设置,则应在正在设置的值和 schema_option 的当前值(可通过执行 sp_helpmergearticle 确定)之间执行 &(位与)运算。

    有效架构选项表

    下表描述了所允许的 schema_option 值(具体取决于项目类型)。

    项目类型

    架构选项值

    func schema only

    0x010x2000

    indexed view schema only

    0x010x0400x01000x20000x400000x10000000x200000

    proc schema only

    0x010x2000

    table

    所有选项。

    view schema only

    0x010x0400x01000x20000x400000x10000000x200000

    示例

    DECLARE @publication AS sysname;
    DECLARE @article AS sysname;
    SET @publication = N'AdvWorksSalesOrdersMerge';
    SET @article = N'SalesOrderHeader';
    
    -- Enable column-level conflict tracking.
    -- Changing this property requires that existing subscriptions
    -- be reinitialized and that a new snapshot be generated.
    USE [AdventureWorks2012]
    EXEC sp_changemergearticle 
      @publication = @publication,
      @article = @article, 
      @property = N'column_tracking', 
      @value = N'true',
      @force_invalidate_snapshot = 1,
      @force_reinit_subscription = 1;
    GO
    

    权限

    只有 sysadmin 固定服务器角色的成员或 db_owner 固定数据库角色的成员才能执行 sp_changemergearticle

    请参阅

    参考

    sp_addmergearticle (Transact-SQL)

    sp_dropmergearticle (Transact-SQL)

    sp_helpmergearticle (Transact-SQL)

    复制存储过程 (Transact-SQL)

    概念

    查看和修改项目属性

    更改发布和项目属性