sp_changemergearticle (Transact-SQL)
适用范围:SQL Server
更改合并项目的属性。 此存储过程在发布服务器上对发布数据库执行。
语法
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'
项目所在的发布的名称。 @publication 为 sysname,无默认值。
[ @article = ] N'article'
要更改的项目的名称。 @article 为 sysname,无默认值。
[ @property = ] N'property'
要更改给定项目和发布的属性。 @property为 sysname,可以是下表中列出的值之一。
[ @value = ] N'value'
指定属性的新值。 @value 为 nvarchar(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 语句。 重要说明:若要 false delete_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 |
对项目的筛选将为每个订阅生成唯一的不重叠分区。 注意:如果指定一个值 3 partition_options ,则本文中每个数据分区只能有一个订阅。 如果创建了第二个订阅,其中新订阅的筛选条件解析为与现有订阅相同的分区,则会删除现有订阅。 |
|
pre_creation_command |
none |
如果订阅服务器上已存在该表,则不执行任何操作。 |
delete |
根据子集筛选器中的 WHERE 子句发出 delete 命令。 | |
drop |
删除该表,然后重新创建一个表。 | |
truncate |
截断目标表。 | |
processing_order |
指示合并发布中项目处理顺序的 int 。 | |
pub_identity_range |
如果项目identityrangemanagementoption 已设置为auto 或auto_identity_range 设置为 true ,则 bigint 指定分配给具有服务器订阅服务器的订阅服务器的范围大小。 此标识范围是为重新发布订阅服务器保留的,用于分配给其自身的订阅服务器。 仅适用于表项目。 有关详细信息,请参阅复制标识列的“合并复制”部分。 |
|
published_in_tran_pub |
true |
项目也在事务发布中发布。 |
false |
项目也不会在事务发布中发布。 | |
resolver_info |
用于指定自定义冲突解决程序所需的其他信息。 某些Microsoft解析程序需要提供作为解析程序的输入的列。 resolver_info 为 nvarchar(255),默认值为 NULL . 有关详细信息,请参阅 高级合并复制冲突 - 基于 COM 的冲突解决程序。 |
|
schema_option (位图) |
有关详细信息,请参阅备注部分。 | |
0x00 |
禁用快照代理的脚本,并使用 |
|
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、datetimeoffset 和 datetime2)转换为早期版本的 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 控制合并代理何时分配新的标识范围。 如果使用了在阈值中指定的百分比值,合并代理将创建新的标识范围。 设置为identityrangemanagementoption auto 或auto_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
指定值3
partition_options
时,每当合并代理运行时,元数据就会被清理,分区快照会更快地过期。 使用此选项时,应考虑启用订阅服务器请求的分区快照。 有关详细信息,请参阅 为包含参数化筛选器的合并发布创建快照。
设置 column_tracking
属性时,如果表已在其他合并发布中发布,则列跟踪必须与基于此表的现有项目使用的值相同。 此参数只适用于表项目。
如果多个发布基于同一基础表发布项目,则更改 delete_tracking
一篇文章的属性或 compensate_for_errors
属性会导致对基于同一表的其他项目进行相同的更改。
如果合并进程使用的发布服务器登录/用户帐户没有正确的表权限,则无效的更改将记录为冲突。
更改值 schema_option
时,系统不会执行按位更新。 这意味着,使用schema_option
sp_changemergearticle
时,可能会关闭现有位设置。 若要保留现有设置,应在要设置的值与当前值之间执行和(按位 AND),这可以通过执行sp_helpmergearticle来确定。schema_option
注意
当出版物中的许多(可能为数百条)的文章执行 sp_changemergearticle
其中一篇文章时,可能需要很长时间才能完成执行。
有效的架构选项表
下表根据项目类型描述了允许 schema_option
的值。
文章类型 | 架构选项值 |
---|---|
func schema only |
0x01 和 0x2000 |
indexed view schema only |
0x01 、0x040 、0x0100 、0x2000 、0x40000 、0x1000000 和 0x200000 |
proc schema only |
0x01 和 0x2000 |
table |
所有选项。 |
view schema only |
0x01 、0x040 、0x0100 、0x2000 、0x40000 、0x1000000 和 0x200000 |
示例
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
。