sp_changearticle (Transact-SQL)

适用于: SQL Server Azure SQL 托管实例

更改事务或快照发布中的项目属性。 此存储过程在发布服务器上对发布数据库执行。

Transact-SQL 语法约定

语法

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

参数

[ @publication = ] N'publication'

包含项目的发布的名称。 @publication为 sysname,默认值为 NULL.

[ @article = ] N'article'

要更改其属性的项目的名称。 @article为 sysname,默认值为 NULL.

[ @property = ] N'property'

要更改的项目属性。 @propertynvarchar(100),默认值为 NULL.

[ @value = ] N'value'

项目属性的新值。 @valuenvarchar(255),默认值为 NULL.

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

properties 说明
creation_script 用于创建目标表的项目架构脚本的路径和名称。 默认为 NULL
del_cmd DELETE 要执行的语句;否则,它从日志构造。
description 项目的新说明项。
dest_object 提供该列是为了向后兼容。 使用 dest_table
dest_table 新目标表。
destination_owner 目标对象所有者的名称。
filter 要用于筛选表(水平筛选)的新存储过程。 默认为 NULL。 无法更改对等复制中的发布。
fire_triggers_on_snapshot true 应用初始快照时会执行已复制的用户触发器。

注意:若要复制触发器,必须包含值的位掩码值schema_option0x100
false 应用初始快照时,不会执行复制的用户触发器。
identity_range 控制在订阅服务器中分配的标识范围的大小。 对等复制不支持此属性。
ins_cmd INSERT 要执行的语句;否则,它从日志构造。
pre_creation_cmd 可以在应用同步之前删除、删除或截断目标表的预创建命令。
none 不使用命令。
drop 删除目标表。
delete 删除目标表。
truncate 截断目标表。
pub_identity_range 控制在订阅服务器中分配的标识范围的大小。 对等复制不支持此属性。
schema_option 为给定项目指定架构生成选项的位图。 schema_optionbinary(8) 。 有关详细信息,请参阅备注部分。
0x00 通过快照代理禁用脚本。
0x01 生成对象创建(CREATE TABLECREATE PROCEDURE等等)。
0x02 如果已定义,则生成传播项目更改的存储过程。
0x04 标识列是使用 IDENTITY 属性编写脚本的。
0x08 复制 时间戳 列。 如果未设置, 时间戳 列将作为 二进制复制。
0x10 生成对应的聚集索引。
0x20 在订阅服务器中将用户定义数据类型 (UDT) 转换为基本数据类型。 如果 CHECK DEFAULT UDT 列是主键的一部分,或者计算列引用 UDT 列,则不能使用此选项。 Oracle 发布服务器不支持。
0x40 生成相应的非聚集索引。
0x80 包含已对主键声明的引用完整性。
0x100 如果已定义,则复制表项目的用户触发器。
0x200 FOREIGN KEY复制约束。 如果引用的表不是发布的一部分,则不会复制已发布表的所有 FOREIGN KEY 约束。
0x400 CHECK复制约束。
0x800 复制默认值。
0x1000 复制列级排序规则。
0x2000 复制与已发布项目源对象关联的扩展属性。
0x4000 如果在表项目上定义了唯一键,则复制唯一键。
0x8000 使用 ALTER TABLE 语句将表项目的主键和唯一键复制为约束。

注意: 此选项已弃用。 请改用 0x800x4000
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该属性。 如果要将表复制到 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 将大于 8,000 字节的公共语言运行时(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 复制地理和几何图形列的索引。
0x20000000000 SPARSE复制列的属性。 有关此属性的详细信息,请参阅 “使用稀疏列”。
0x40000000000 通过快照代理启用脚本以在订阅服务器上创建内存优化表。
0x80000000000 将聚集索引转换为内存优化项目的非聚集索引。
status 指定属性的新状态。
dts horizontal partitions 标识为仅供参考。 不支持。 不保证以后的兼容性。
include column names 复制语句中包含 INSERT 列名。
no column names 复制的语句中不包含 INSERT 列名称。
no dts horizontal partitions 项目的水平分区不是由可转换的订阅定义的。
none 清除 sysarticles 表中的所有状态选项,并将项目标记为非活动状态。
parameters 使用参数化命令将更改传播给订阅服务器。 这是新项目的默认设置。
string literals 使用字符串文字值将更改传播给订阅服务器。
sync_object 用于生成同步输出文件的表或视图的名称。 默认为 NULL。 Oracle 发布服务器不支持。
tablespace 标识从 Oracle 数据库发布的项目的日志记录表所使用的表空间。 有关详细信息,请参阅管理 Oracle 表空间
threshold 用于控制分发代理何时分配新标识范围的百分比值。 对等复制不支持此属性。
type Oracle 发布服务器不支持。
logbased 基于日志的项目。
logbased manualboth 具有手动筛选器和手动视图并且基于日志的项目。 此选项需要同时设置 sync_objectfilter 属性。 Oracle 发布服务器不支持。
logbased manualfilter 具有手动筛选器并且基于日志的项目。 此选项需要同时设置 sync_objectfilter 属性。 Oracle 发布服务器不支持。
logbased manualview 具有手动视图并且基于日志的项目。 此选项要求还设置 sync_object 属性。 Oracle 发布服务器不支持。
indexed viewlogbased 基于日志的索引视图项目。 Oracle 发布服务器不支持。 对于这种类型的文章,无需单独发布基表。
indexed viewlogbased manualboth 具有手动筛选器和手动视图并且基于日志的索引视图项目。 此选项需要同时设置 sync_objectfilter 属性。 对于这种类型的文章,无需单独发布基表。 Oracle 发布服务器不支持。
indexed viewlogbased manualfilter 具有手动筛选器并且基于日志的索引视图项目。 此选项需要同时设置 sync_objectfilter 属性。 对于这种类型的文章,无需单独发布基表。 Oracle 发布服务器不支持。
indexed viewlogbased manualview 具有手动视图并且基于日志的索引视图项目。 此选项要求还设置 sync_object 属性。 对于这种类型的文章,无需单独发布基表。 Oracle 发布服务器不支持。
upd_cmd UPDATE 要执行的语句;否则,它从日志构造。
NULL 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 指定对项目所做的更改会导致现有订阅重新初始化,并授予订阅重新初始化的权限。

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

[ @publisher = ] N'publisher'

指定非 SQL Server 发布服务器。 @publisher为 sysname,默认值为 NULL.

注意

更改 SQL Server 发布服务器上的项目属性时,不应使用 publisher

返回代码值

0(成功)或 1(失败)。

注解

sp_changearticle 用于快照复制和事务复制。

当项目属于支持对等事务复制的发布时,只能更改 descriptionins_cmdupd_cmddel_cmd属性。

更改以下任何属性都需要生成新快照,并且必须为 @force_invalidate_snapshot 参数指定值:1

  • del_cmd
  • dest_table
  • destination_owner
  • ins_cmd
  • pre_creation_cmd
  • schema_options
  • upd_cmd

更改以下任何属性要求重新初始化现有订阅,并且必须为 @force_reinit_subscription 参数指定值。1

  • del_cmd
  • dest_table
  • destination_owner
  • filter
  • ins_cmd
  • status
  • upd_cmd

在现有发布中,可以使用 sp_changearticle 更改项目,而无需删除并重新创建整个发布。

注意

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

有效的架构选项

下表描述了基于复制类型(显示在顶部)和项目类型(显示在第一列)的允许值 schema_option

文章类型 复制类型 - 事务性 复制类型 - 快照
logbased 以上所有选项 所有选项,但 0x02
logbased manualfilter 以上所有选项 所有选项,但 0x02
logbased manualview 以上所有选项 所有选项,但 0x02
indexed view logbased 以上所有选项 所有选项,但 0x02
indexed view logbased manualfilter 以上所有选项 所有选项,但 0x02
indexed view logbased manualview 以上所有选项 所有选项,但 0x02
indexed view logbase manualboth 以上所有选项 所有选项,但 0x02
proc exec 0x01、、0x200x4000000x20000x8000000x20000000x8000000、、0x100000000x200000000x400000000x80000000 0x01、、0x200x4000000x20000x8000000x20000000x8000000、、0x100000000x200000000x400000000x80000000
serializable proc exec 0x01、、0x200x4000000x20000x8000000x20000000x8000000、、0x100000000x200000000x400000000x80000000 0x01、、0x200x4000000x20000x8000000x20000000x8000000、、0x100000000x200000000x400000000x80000000
proc schema only 0x01、、0x200x4000000x20000x8000000x20000000x8000000、、0x100000000x200000000x400000000x80000000 0x01、、0x200x4000000x20000x8000000x20000000x8000000、、0x100000000x200000000x400000000x80000000
view schema only 0x010x010、、0x0400x020、、 0x20000x01000x400000000x80000000x8000000x2000000x20000000x400000x1000000x4000000x80000000 0x010x010、、0x0400x020、、 0x20000x01000x400000000x80000000x8000000x2000000x20000000x400000x1000000x4000000x80000000
func schema only 0x01、、0x200x4000000x20000x8000000x20000000x8000000、、0x100000000x200000000x400000000x80000000 0x01、、0x200x4000000x20000x8000000x20000000x8000000、、0x100000000x200000000x400000000x80000000
indexed view schema only 0x010x010、、0x0400x020、、 0x20000x01000x400000000x80000000x8000000x2000000x20000000x400000x1000000x4000000x80000000 0x010x010、、0x0400x020、、 0x20000x01000x400000000x80000000x8000000x2000000x20000000x400000x1000000x4000000x80000000

注意

对于排队更新发布, schema_option 必须启用该值 0x80 。 非 SQL Server 发布的受schema_option支持值为:0x01、、、0x100x020x400x800x10000x4000

示例

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
DECLARE @option AS int;
SET @publication = N'AdvWorksProductTran';
SET @article = N'Product';
SET @option = (SELECT CAST(0x0000000002030073 AS int));

-- Change the schema options to replicate schema with XML.
USE [AdventureWorks2022]
EXEC sp_changearticle 
  @publication = @publication,
  @article = @article, 
  @property = N'schema_option', 
  @value = @option,
  @force_invalidate_snapshot = 1;
GO

权限

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