sp_changemergearticle (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 设置为 auto 或 auto_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
对项目的筛选将为每个订阅生成唯一的不重叠分区。
注意如果指定 partition_options 的值为 3,则该项目中每个数据分区只能有一个订阅。如果创建了另一个订阅,而这个新订阅的筛选条件解析到的分区与现有订阅的分区相同,则会删除现有订阅。pre_creation_command
none
如果订阅服务器上已存在该表,则不执行任何操作。
delete
根据子集筛选器中的 WHERE 子句发出 delete 命令。
drop
删除该表,然后重新创建一个表。
truncate
截断目标表。
processing_order
int 值,用于指示合并发布中项目的处理顺序。
pub_identity_range
bigint 值。如果项目的 identityrangemanagementoption 设置为 auto 或 auto_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 支持的数据类型。有关如何映射这些类型的信息,请参阅在复制拓扑中使用 SQL Server 的多个版本中的“映射新数据类型以用于早期版本”一节。
0x40000000
复制权限。
0x80000000
尝试删除不属于发布一部分的任何对象的依赖项。
0x100000000
如果对 varbinary(max) 列指定了 FILESTREAM 属性,则使用此选项可复制此属性。如果要将表复制到 SQL Server 2005 订阅服务器,请勿指定此选项。不论此架构选项的设置如何,均不支持将包含 FILESTREAM 列的表复制到 SQL Server 2000 订阅服务器。请参阅相关选项 0x800000000。
0x200000000
将在 SQL Server 2008 中引入的日期和时间数据类型(date、time、datetimeoffset 和 datetime2)转换为 SQL Server 早期版本支持的数据类型。有关如何映射这些类型的信息,请参阅在复制拓扑中使用 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 子句。仅适用于表项目。
threshold
用于运行 SQL Server Compact 3.5 SP2 或更早版本的 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 的数据类型为 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_cmd
schema_options
subset_filterclause
更改下列属性需要重新初始化现有订阅,因而必须将 force_reinit_subscription 参数的值指定为 1:
check_permissions
column_tracking
destination_owner
subscriber_upload_options
subset_filterclause
如果指定 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 |
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 [AdventureWorks2008R2]
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。