sp_changearticle (Transact-SQL)

适用于:SQL ServerAzure SQL 托管实例

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

Transact-SQL 语法约定

语法

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

参数

[ @publication = ] 'publication' 包含项目的发布的名称。 publicationsysname,默认值为 NULL。

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

[ @property = ] 'property' 要更改的项目属性。 属性nvarchar(100)。

[ @value = ] 'value' 项目属性的新值。 值为 nvarchar(255)。

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

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

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

注意:此选项已弃用。 请改用 0x800x4000
0x10000 以 NOT FOR REPLICATION 方式复制 CHECK 约束,以便在同步期间不强制执行约束。
0x20000 以 NOT FOR REPLICATION 方式复制 FOREIGN KEY 约束,以便在同步期间不强制执行约束。
0x40000 复制与已分区表或已分区索引相关联的文件组。
0x80000 复制已分区表的分区方案。
0x100000 复制已分区索引的分区方案。
0x200000 复制表统计信息。
0x400000 默认绑定
0x800000 规则绑定
0x1000000 全文索引
0x2000000 不会副本 (replica)绑定到 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 属性,请使用此选项副本 (replica)它。 如果要将表副本 (replica)到 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 复制数据和索引的压缩选项。 有关详细信息,请参阅 Data Compression
0x800000000 设置此选项可将 FILESTREAM 数据存储到订阅服务器上其自身的文件组中。 如果不设置此选项,FILESTREAM 数据将存储在默认文件组中。 由于复制操作不创建文件组,因此如果您设置此选项,您必须先创建文件组,然后在订阅服务器上应用快照。 有关如何在应用快照之前创建对象的详细信息,请参阅应用快照之前和之后执行脚本。

请参阅相关选项 0x100000000
0x1000000000 将大于 8000 字节的公共语言运行时(CLR)用户定义类型(UDT)转换为 varbinary(max),以便可以将 UDT 类型的列副本 (replica)到运行 SQL Server 2005 (9.x) 的订阅服务器。
0x2000000000 hierarchyid 数据类型转换为 varbinary(max),以便可以将类型 hierarchyid 的列副本 (replica)到运行 SQL Server 2005 (9.x) 的订阅服务器。 有关如何在副本 (replica)表中使用 hierarchyid 列的详细信息,请参阅 hierarchyid (Transact-SQL)。
0x4000000000 复制表的任何筛选的索引。 有关筛选索引的详细信息,请参阅 “创建筛选索引”。
0x8000000000 地理几何数据类型转换为 varbinary(max),以便可以将这些类型的列副本 (replica)到运行 SQL Server 2005 (9.x) 的订阅服务器。
0x10000000000 复制地理和几何图形列的索引。
0x20000000000 复制列的 SPARSE 属性。 有关此属性的详细信息,请参阅 “使用稀疏列”。
0x40000000000 启用快照代理的脚本,以在订阅服务器上创建内存优化表。
0x80000000000 将聚集索引转换为内存优化项目的非聚集索引。
status 指定属性的新状态。
dts 水平分区 标识为仅供参考。 不支持。 不保证以后的兼容性。
include 列名称 复制的 INSERT 语句中包括列名。
无列名称 复制的 INSERT 语句中不包括列名。
无 dts 水平分区 项目的水平分区不由可转换的订阅定义。
清除 sysarticles 表中的所有状态选项,并将项目标记为非活动状态。
参数 使用参数化命令将更改传播给订阅服务器。 这是新项目的默认设置。
字符串 使用字符串文字值将更改传播给订阅服务器。
sync_object 用于生成同步输出文件的表或视图的名称。 默认值为 NULL。 Oracle 发布服务器不支持。
tablespace 标识从 Oracle 数据库发布的项目的日志记录表所使用的表空间。 有关详细信息,请参阅管理 Oracle 表空间
threshold 用于控制分发代理何时分配新标识范围的百分比值。 对等复制不支持此属性。
type Oracle 发布服务器不支持。
logbased 基于日志的项目。
logbased manualboth 具有手动筛选器和手动视图并且基于日志的项目。 此选项要求 同时设置sync_object筛选器 属性。 Oracle 发布服务器不支持。
logbased manualfilter 具有手动筛选器并且基于日志的项目。 此选项要求 同时设置sync_object筛选器 属性。 Oracle 发布服务器不支持。
logbased manualview 具有手动视图并且基于日志的项目。 此选项要求 同时设置sync_object 属性。 Oracle 发布服务器不支持。
indexed viewlogbased 基于日志的索引视图项目。 Oracle 发布服务器不支持。 对于此类型的项目,不需要单独发布基表。
已编制索引的 viewlogbased manualboth 具有手动筛选器和手动视图并且基于日志的索引视图项目。 此选项要求 同时设置sync_object筛选器 属性。 对于此类型的项目,不需要单独发布基表。 Oracle 发布服务器不支持。
indexed viewlogbased manualfilter 具有手动筛选器并且基于日志的索引视图项目。 此选项需要 同时设置sync_object筛选器 属性。 对于此类型的项目,不需要单独发布基表。 Oracle 发布服务器不支持。
已编制索引的 viewlogbased manualview 具有手动视图并且基于日志的索引视图项目。 此选项要求 同时设置sync_object 属性。 对于此类型的项目,不需要单独发布基表。 Oracle 发布服务器不支持。
upd_cmd 要执行的 UPDATE 语句,否则从日志构造。
NULL Null 返回可更改的项目属性列表。

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

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

1 指定对文章的更改可能会导致快照无效,如果存在需要新快照的现有订阅,则授予现有快照标记为已过时和生成的新快照的权限。

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

[ @force_reinit_subscription = ]force_reinit_subscription_ 确认此存储过程执行的操作可能需要重新初始化现有订阅。 force_reinit_subscription是一个默认值为 0 的位

0 指定对项目所做的更改不会导致重新初始化订阅。 如果该存储过程检测到更改将需要重新初始化现有订阅,则会发生错误,并且不进行任何更改。

1 指定对项目所做的更改会导致重新初始化现有订阅,并授予订阅重新初始化的权限。

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

[ @publisher = ] 'publisher' 指定非 SQL Server 发布服务器。 publishersysname,默认值为 NULL。

注意

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

返回代码值

0 (成功) 或 1 (失败)

注解

sp_changearticle用于快照 副本 (replica)和事务副本 (replica)。

当项目属于支持对等事务性副本 (replica)的发布时,只能更改说明ins_cmdupd_cmddel_cmd属性。

更改以下任何属性都需要生成新的快照,并且必须为 force_invalidate_快照 参数指定值 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的值时,系统不会执行按位更新。 这意味着,使用sp_changearticle设置schema_option时,可能会关闭现有位设置。 若要保留现有设置,应执行 |(按位或)设置的值与schema_option当前值之间,可以通过执行sp_helparticle来确定该值。

有效架构选项

下表根据副本 (replica)类型(显示在顶部)和项目类型(显示第一列)描述schema_option的允许值

文章类型 复制类型 - 事务性 复制类型 - 快照
logbased 以上所有选项 所有选项,但 0x02
logbased manualfilter 以上所有选项 所有选项,但 0x02
logbased manualview 以上所有选项 所有选项,但 0x02
已编制索引的视图日志 以上所有选项 所有选项,但 0x02
索引视图 logbased manualfilter 以上所有选项 所有选项,但 0x02
索引视图 logbased manualview 以上所有选项 所有选项,但 0x02
索引视图 logbase manualboth 以上所有选项 所有选项,但 0x02
proc exec 0x01、0x200x20000x400000、0x8000000x20000000x8000000、0x10000000、0x200000000x40000000和0x80000000 0x01、0x200x20000x400000、0x8000000x20000000x8000000、0x10000000、0x200000000x40000000和0x80000000
serializable proc exec 0x01、0x200x20000x400000、0x8000000x20000000x8000000、0x10000000、0x200000000x40000000和0x80000000 0x01、0x200x20000x400000、0x8000000x20000000x8000000、0x10000000、0x200000000x40000000和0x80000000
仅限 proc 架构 0x01、0x200x20000x400000、0x8000000x20000000x8000000、0x10000000、0x200000000x40000000和0x80000000 0x01、0x200x20000x400000、0x8000000x20000000x8000000、0x10000000、0x200000000x40000000和0x80000000
仅查看架构 0x01、0x0100x0200x0400x0100、0x20000x40000、0x100000、0x200000、0x400000、0x800000、0x20000000x80000000x40000000和0x80000000 0x01、0x0100x0200x0400x0100、0x20000x40000、0x100000、0x200000、0x400000、0x800000、0x20000000x80000000x40000000和0x80000000
仅限 func 架构 0x01、0x200x20000x400000、0x8000000x20000000x8000000、0x10000000、0x200000000x40000000和0x80000000 0x01、0x200x20000x400000、0x8000000x20000000x8000000、0x10000000、0x200000000x40000000和0x80000000
仅限索引视图架构 0x01、0x0100x0200x0400x0100、0x20000x40000、0x100000、0x200000、0x400000、0x800000、0x20000000x80000000x40000000和0x80000000 0x01、0x0100x0200x0400x0100、0x20000x40000、0x100000、0x200000、0x400000、0x800000、0x20000000x80000000x40000000和0x80000000

注意

对于排队更新发布,必须启用0x80 schema_option值。 非 SQL Server 发布的支持的schema_option值包括:0x010x02、0x100x400x800x10000x4000

示例

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

另请参阅

查看和修改项目属性
更改发布和项目属性
sp_addarticle (Transact-SQL)
sp_articlecolumn (Transact-SQL)
sp_droparticle (Transact-SQL)
sp_helparticle (Transact-SQL)
sp_helparticlecolumns (Transact-SQL)