sp_changemergearticle (Transact-SQL)
适用于:SQL Server
更改合并项目的属性。 此存储过程在发布服务器上对发布数据库执行。
语法
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'
要更改给定项目和发布的 属性。 属性 为 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 | 手动 | 禁用自动标识范围管理。 使用 NOT FOR REPLICATION 标记标识列,启用手动标识范围处理。 有关详细信息,请参阅复制标识列。 |
无 | 禁用所有标识范围管理。 | |
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 | 无 | 如果订阅服务器上已存在该表,则不执行任何操作。 |
delete | 根据子集筛选器中的 WHERE 子句发出 delete 命令。 | |
下降 | 删除该表,然后重新创建一个表。 | |
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 | 复制 CHECK 约束。 | |
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 (9.x) 中引入的 nvarchar (max) 、varchar (max) 和 varbinary (max ) ) 的大型对象数据类型转换为 SQL Server 2000 (8.x) 支持的数据类型。 | |
0x40000000 | 复制权限。 | |
0x80000000 | 尝试删除不属于发布一部分的任何对象的依赖项。 | |
0x100000000 | 如果在 varbinary (最大) 列上指定了 FILESTREAM 属性,请使用此选项复制它。 如果要将表复制到 SQL Server 2005 (9.x) 订阅服务器,请不要指定此选项。 无论如何设置此架构选项,都不支持将 FILESTREAM 列复制到 SQL Server 2000 (8.x) 订阅服务器的表。 请参阅相关选项 0x800000000。 | |
0x200000000 | 将 SQL Server 2008 (10.0.x) 中引入的日期和时间数据类型 (日期、时间、datetimeoffset 和 datetime2) 转换为早期版本的 SQL Server 支持的数据类型。 | |
0x400000000 | 复制数据和索引的压缩选项。 有关详细信息,请参阅 Data Compression。 | |
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 (Transact-SQL) 。 | |
0x4000000000 | 复制表的任何筛选的索引。 有关筛选索引的详细信息,请参阅 创建筛选索引。 | |
0x8000000000 | 将 geography 和 geometry 数据类型转换为 varbinary (max) ,以便可以将这些类型的列复制到运行 SQL Server 2005 (9.x) 的订阅服务器。 | |
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的订阅服务器的百分比值。 阈值控制合并代理何时分配新的标识范围。 如果使用了在阈值中指定的百分比值,合并代理将创建新的标识范围。 当 identityrangemanagementoption 设置为 auto 或 auto_identity_range 设置为 true 时使用。 仅适用于表项目。 有关详细信息,请参阅复制 标识列的“合并复制”部分。 | |
verify_resolver_signature | 1 | 通过验证自定义冲突解决程序的数字签名来确定该签名是否来自可信来源。 |
0 | 不通过验证自定义冲突解决程序的数字签名来确定该签名是否来自可信来源。 | |
NULL(默认值) | 返回 属性支持的值的列表。 |
[ @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
为 partition_options 指定值 3 时,每当运行合并代理并且分区快照过期更快时,就会清理元数据。 使用此选项时,应考虑启用订阅服务器请求的分区快照。 有关详细信息,请参阅 Snapshots for Merge Publications with Parameterized Filters。
设置 column_tracking 属性时,如果表已在其他合并发布中发布,则列跟踪必须与基于此表的现有项目使用的值相同。 此参数只适用于表项目。
如果多个发布发布基于同一基础表的项目,则更改一个项目的 delete_tracking 属性或 compensate_for_errors 属性会导致对基于同一表的其他项目进行相同的更改。
如果合并进程使用的发布服务器登录名/用户帐户没有正确的表权限,则无效更改将被记录为冲突。
更改 schema_option 的值时,系统不会执行按位更新。 这意味着,使用sp_changemergearticle 设置schema_option时,现有位设置可能会关闭。 若要保留现有设置,应在所设置的值与schema_option的当前值之间执行 & (位和 ) ,这可以通过执行 sp_helpmergearticle来确定。
注意
如果许多人在发布中 (数百) 项目,并且为其中一个项目执行 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。
另请参阅
查看和修改项目属性
更改发布和项目属性
sp_addmergearticle (Transact-SQL)
sp_dropmergearticle (Transact-SQL)
sp_helpmergearticle (Transact-SQL)
复制存储过程 (Transact-SQL)