sp_changemergearticle (Transact-SQL)

适用范围:SQL Server

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

Transact-SQL 语法约定

语法

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

参数

[ @publication = ] N'publication'

项目所在的发布的名称。 @publicationsysname,无默认值。

[ @article = ] N'article'

要更改的项目的名称。 @articlesysname,无默认值。

[ @property = ] N'property'

要更改给定项目和发布的属性。 @property为 sysname,可以是下表中列出的值之一。

[ @value = ] N'value'

指定属性的新值。 @valuenvarchar(2000),可以是下表中列出的值之一。

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

properties 说明
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 语句。

重要说明:若要falsedelete_tracking导致非收敛,需要手动删除已删除的行。
description 项目的说明项。
destination_owner 订阅数据库中对象的所有者名称(如果不是 dbo)。
identity_range 如果项目已设置为或auto_identity_range设置为 true,则 bigint 指定在分配新标识值时auto要使用的范围大小。identityrangemanagementoption 仅适用于表项目。 有关详细信息,请参阅复制标识列“合并复制”部分。
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 对项目的筛选将为每个订阅生成唯一的不重叠分区。

注意:如果指定一个值3partition_options,则本文中每个数据分区只能有一个订阅。 如果创建了第二个订阅,其中新订阅的筛选条件解析为与现有订阅相同的分区,则会删除现有订阅。
pre_creation_command none 如果订阅服务器上已存在该表,则不执行任何操作。
delete 根据子集筛选器中的 WHERE 子句发出 delete 命令。
drop 删除该表,然后重新创建一个表。
truncate 截断目标表。
processing_order 指示合并发布中项目处理顺序的 int
pub_identity_range 如果项目identityrangemanagementoption已设置为autoauto_identity_range设置为 true,则 bigint 指定分配给具有服务器订阅服务器的订阅服务器的范围大小。 此标识范围是为重新发布订阅服务器保留的,用于分配给其自身的订阅服务器。 仅适用于表项目。 有关详细信息,请参阅复制标识列“合并复制”部分。
published_in_tran_pub true 项目也在事务发布中发布。
false 项目也不会在事务发布中发布。
resolver_info 用于指定自定义冲突解决程序所需的其他信息。 某些Microsoft解析程序需要提供作为解析程序的输入的列。 resolver_infonvarchar(255),默认值为 NULL. 有关详细信息,请参阅 高级合并复制冲突 - 基于 COM 的冲突解决程序
schema_option (位图) 有关详细信息,请参阅备注部分。
0x00 禁用快照代理的脚本,并使用 creation_script提供的脚本。
0x01 生成对象创建脚本(CREATE TABLE、CREATE PROCEDURE 等)。
0x10 生成对应的聚集索引。
0x20 在订阅服务器中将用户定义数据类型转换为基本数据类型。 如果用户定义类型 (UDT) 列存在 CHECK 或 DEFAULT 约束,或者 UDT 列是主键的一部分,或者计算列引用 UDT 列,则不能使用此选项。
0x40 生成相应的非聚集索引。
0x80 包含已对主键声明的引用完整性。
0x100 如果已定义,则复制表项目的用户触发器。
0x200 复制 FOREIGN KEY 约束。 如果引用的表不是发布的一部分,则不会复制已发布表上的所有 FOREIGN KEY 约束。
0x400 复制 CHECK 约束。
0x800 复制默认值。
0x1000 复制列级排序规则。
0x2000 复制与已发布项目源对象关联的扩展属性。
0x4000 如果在表项目上定义了唯一键,则复制唯一键。
0x8000 在编写约束脚本时生成 ALTER TABLE 语句。
0x10000 将 CHECK 约束复制为 NOT FOR REPLICATION,以便在同步期间不强制实施约束。
0x20000 将 FOREIGN KEY 约束复制为 NOT FOR REPLICATION,以便在同步期间不强制实施约束。
0x40000 复制与已分区表或已分区索引相关联的文件组。
0x80000 复制已分区表的分区方案。
0x100000 复制已分区索引的分区方案。
0x200000 复制表统计信息。
0x400000 复制默认绑定
0x800000 复制规则绑定。
0x1000000 复制全文索引。
0x2000000 不会复制绑定到 xml 列的 XML 架构集合。
0x4000000 复制 xml 列上的索引。
0x8000000 创建订阅服务器中尚不存在的任何架构。
0x10000000 xml 列转换为订阅服务器上的 ntext
0x20000000 将 SQL Server 2005(9.x)中引入的大型对象数据类型(nvarchar(max)varchar(max)varbinary(max)转换为 SQL Server 2000(8.x)支持的数据类型。
0x40000000 复制权限。
0x80000000 尝试删除不属于发布的任何对象的依赖项。
0x100000000 如果对 varbinary(max) 列指定了 FILESTREAM 属性,请使用此选项复制 FILESTREAM 属性。 如果要将表复制到 SQL Server 2005 (9.x) 订阅服务器,请不要指定此选项。 不支持将具有 FILESTREAM 列的表复制到 SQL Server 2000 (8.x) 订阅服务器,而不考虑如何设置此架构选项。 请参阅相关选项 0x800000000
0x200000000 将 SQL Server 2008(10.0.x)中引入的日期和时间数据类型(date、time、datetimeoffsetdatetime2)转换为早期版本的 SQL Server 支持的数据类型。
0x400000000 复制数据和索引的压缩选项。 有关详细信息,请参阅数据压缩
0x800000000 设置此选项可将 FILESTREAM 数据存储到订阅服务器上其自身的文件组中。 如果未设置此选项,则 FILESTREAM 数据存储在默认文件组中。 复制不创建文件组;因此,如果设置此选项,则必须在订阅服务器上应用快照之前创建文件组。 有关如何在应用快照之前创建对象的详细信息,请参阅 “应用快照之前和之后执行脚本”。

请参阅相关选项 0x100000000
0x1000000000 将公共语言运行时(CLR)用户定义类型(UDT)转换为 varbinary(max), 以便可以将 UDT 类型的列复制到运行 SQL Server 2005(9.x)的订阅服务器。
0x2000000000 hierarchyid 数据类型转换为 varbinary(max), 以便可以将类型 hierarchyid 的列复制到运行 SQL Server 2005 (9.x) 的订阅服务器。 有关如何在复制表中使用 hierarchyid 列的详细信息,请参阅 hierarchyid 数据类型方法参考
0x4000000000 复制表的任何筛选的索引。 有关筛选索引的详细信息,请参阅创建筛选索引
0x8000000000 地理几何 数据类型转换为 varbinary(max), 以便可以将这些类型的列复制到运行 SQL Server 2005 (9.x) 的订阅服务器。
0x10000000000 复制地理和几何图形列的索引。
NULL 系统自动生成项目的有效架构选项。
status active 用于发布表的初始处理脚本已运行。
unsynced 用于发布表的初始处理脚本在下一次运行快照代理时运行。
stream_blob_columns true 复制二进制大型对象列时使用数据流优化。 但是,某些合并复制功能(如逻辑记录)仍可阻止使用流优化。 stream_blob_columns 启用 FILESTREAM 时设置为 true。 这使复制 FILESTREAM 数据的性能达到最佳并减少内存使用率。 若要强制 FILESTREAM 表项目不使用 Blob 流式处理,请设置为 stream_blob_columns false。

重要说明:启用此内存优化可能会损害同步期间合并代理的性能。 仅当复制包含数兆字节数据的列时,才应使用此选项。
false 复制二进制大型对象列时,不会使用优化。
subscriber_upload_options 0 不限制在包含客户端订阅的订阅服务器上进行更新;将更改上载到发布服务器。 更改此属性可能需要重新初始化现有订阅服务器。
1 订阅服务器上允许更改具有客户端订阅,但不会上传到发布服务器。
2 客户端订阅的订阅服务器上不允许更改。
subset_filterclause 用于指定水平筛选的 WHERE 子句。 仅适用于表项目。

重要说明: 出于性能原因,建议不要将函数应用于参数化行筛选器子句中的列名,例如 LEFT([MyColumn]) = SUSER_SNAME()。 如果在 filter 子句中使用 HOST_NAME 并重写HOST_NAME值,则可能需要使用 CONVERT 转换数据类型。 有关此情况的最佳做法的详细信息,请参阅参数化筛选器 - 参数化行筛选器中的“重写 HOST_NAME() 值”部分。
threshold 用于运行 SQL Server Compact 或早期版本的 SQL Server 的订阅服务器的百分比值。 threshold控制合并代理何时分配新的标识范围。 如果使用了在阈值中指定的百分比值,合并代理将创建新的标识范围。 设置为identityrangemanagementoptionautoauto_identity_range设置为 true. 仅适用于表项目。 有关详细信息,请参阅复制标识列“合并复制”部分。
verify_resolver_signature 1 验证自定义解析程序上的数字签名,以确定它是否来自受信任的源。
0 不会验证自定义解析程序上的数字签名,以确定它是否来自受信任的源。
NULL(默认值) 返回@property支持的值列表。

[ @force_invalidate_snapshot = ] force_invalidate_snapshot

确认此存储过程执行的操作可能会使现有快照失效。 @force_invalidate_snapshot为,默认值为 0.

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

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

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

[ @force_reinit_subscription = ] force_reinit_subscription

确认此存储过程所执行的操作是否需要重新初始化现有订阅。 @force_reinit_subscription为,默认值为 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

指定值3partition_options时,每当合并代理运行时,元数据就会被清理,分区快照会更快地过期。 使用此选项时,应考虑启用订阅服务器请求的分区快照。 有关详细信息,请参阅 为包含参数化筛选器的合并发布创建快照

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

如果多个发布基于同一基础表发布项目,则更改 delete_tracking 一篇文章的属性或 compensate_for_errors 属性会导致对基于同一表的其他项目进行相同的更改。

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

更改值 schema_option时,系统不会执行按位更新。 这意味着,使用schema_optionsp_changemergearticle时,可能会关闭现有位设置。 若要保留现有设置,应在要设置的值与当前值之间执行和(按位 AND),这可以通过执行sp_helpmergearticle来确定。schema_option

注意

当出版物中的许多(可能为数百条)的文章执行 sp_changemergearticle 其中一篇文章时,可能需要很长时间才能完成执行。

有效的架构选项表

下表根据项目类型描述了允许 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 [AdventureWorks2022]
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