sp_changearticle (Transact-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'
    包含该项目的发布的名称。publication 的数据类型为 sysname,默认值是 NULL。

  • [ @article=] 'article'
    将更改其属性的项目的名称。article 的数据类型是 sysname,默认值是 NULL。

  • [ @property=] 'property'
    要更改的项目属性。property 的数据类型为 nvarchar(100)。

  • [ @value=] 'value'
    项目属性的新值。value 的数据类型为 nvarchar(255)。

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

    属性

    说明

    creation_script

     

    用于创建目标表的项目架构脚本的路径和名称。默认值为 NULL。

    del_cmd

     

    要执行的 DELETE 语句,否则从日志构造。

    description

     

    项目的新说明项。

    dest_object

     

    提供该列是为了向后兼容。使用 dest_table

    dest_table

     

    新目标表。

    destination_owner

     

    目标对象所有者的名称。

    筛选

     

    要用于筛选表(水平筛选)的新存储过程。默认值为 NULL。对于对等复制中的发布,此值不能更改。

    fire_triggers_on_snapshot

    True

    应用初始快照时会执行已复制的用户触发器。

    注意注意
    对于要复制的触发器,schema_option 的位掩码值必须包括值 0x100

     

    False

    应用初始快照时不会执行已复制的用户触发器。

    identity_range

     

    控制在订阅服务器中分配的标识范围的大小。对等复制不支持此属性。

    ins_cmd

     

    要执行的 INSERT 语句,否则从日志构造。

    pre_creation_cmd

    可以在应用同步之前除去、删除或截断目标表的预创建命令。

     

    不使用命令。

     

    drop

    删除目标表。

     

    delete

    删除目标表。

     

    truncate

    截断目标表。

    pub_identity_range

     

    控制在订阅服务器中分配的标识范围的大小。对等复制不支持此属性。

    schema_option

    为给定项目指定架构生成选项的位图。schema_option 的数据类型是 binary(8)。有关详细信息,请参阅本主题后面的“备注”部分。

     

    0x00

    通过快照代理禁用脚本。

     

    0x01

    生成对象创建(CREATE TABLE、CREATE PROCEDURE 等)。

     

    0x02

    如果已定义,则生成传播项目更改的存储过程。

     

    0x04

    使用 IDENTITY 属性为标识列编写脚本。

     

    0x08

    复制 timestamp 列。如果不设置,则 timestamp 列将作为 binary 进行复制。

     

    0x10

    生成对应的聚集索引。

     

    0x20

    在订阅服务器中将用户定义数据类型 (UDT) 转换为基本数据类型。如果 UDT 列是主键的一部分或者计算列引用 UDT 列,则当 UDT 列上具有 CHECK 或 DEFAULT 约束时,此选项无法使用。Oracle 发布服务器不支持。

     

    0x40

    生成相应的非聚集索引。

     

    0x80

    包含已对主键声明的引用完整性。

     

    0x100

    如果已定义,则复制表项目的用户触发器。

     

    0x200

    复制 FOREIGN KEY 约束。如果被引用的表不是发布的一部分,则不会复制已发布表的任何 FOREIGN KEY 约束。

     

    0x400

    复制检查约束。

     

    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

    不复制绑定到 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) 中大于 8000 字节的用户定义类型 (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 的列的索引。

    0x20000000000

    复制列的 SPARSE 属性。有关该属性的详细信息,请参阅使用稀疏列

    status

    指定属性的新状态。

     

    dts horizontal partitions

    标识为仅供参考。不提供支持。不保证以后的兼容性。

     

    include column names

    复制的 INSERT 语句中包括列名。

     

    no column names

    复制的 INSERT 语句中不包括列名。

     

    no dts horizontal partitions

    项目的水平分区不由可转换的订阅定义。

     

    清除 sysarticles 表中的所有状态选项并将项目标记为不活动。

     

    参数

    使用参数化命令将更改传播给订阅服务器。这是新项目的默认设置。

     

    string literals

    使用字符串文字值将更改传播给订阅服务器。

    sync_object

     

    用于生成同步输出文件的表或视图的名称。默认值为 NULL。Oracle 发布服务器不支持。

    tablespace

    标识从 Oracle 数据库发布的项目的日志记录表所使用的表空间。有关详细信息,请参阅管理 Oracle 表空间

    threshold

     

    用于控制分发代理何时分配新标识范围的百分比值。对等复制不支持此属性。

    type

     

    Oracle 发布服务器不支持。

     

    logbased

    基于日志的项目。

     

    logbased manualboth

    具有手动筛选器和手动视图并且基于日志的项目。此选项也需要设置 sync_object 和 filter 属性。Oracle 发布服务器不支持。

     

    logbased manualfilter

    具有手动筛选器并且基于日志的项目。此选项也需要设置 sync_object 和 filter 属性。Oracle 发布服务器不支持。

     

    logbased manualview

    具有手动视图并且基于日志的项目。此选项也需要设置 sync_object 属性。Oracle 发布服务器不支持。

     

    indexed viewlogbased

    基于日志的索引视图项目。Oracle 发布服务器不支持。对于此类型的项目,不需要单独发布基表。

     

    indexed viewlogbased manualboth

    具有手动筛选器和手动视图并且基于日志的索引视图项目。此选项也需要设置 sync_object 和 filter 属性。对于此类型的项目,不需要单独发布基表。Oracle 发布服务器不支持。

     

    indexed viewlogbased manualfilter

    具有手动筛选器并且基于日志的索引视图项目。此选项也需要设置 sync_object 和 filter 属性。对于此类型的项目,不需要单独发布基表。Oracle 发布服务器不支持。

     

    indexed viewlogbased manualview

    具有手动视图并且基于日志的索引视图项目。此选项也需要设置 sync_object 属性。对于此类型的项目,不需要单独发布基表。Oracle 发布服务器不支持。

    upd_cmd

     

    要执行的 UPDATE 语句,否则从日志构造。

    NULL

    NULL

    返回可更改的项目属性列表。

  • [ @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 指定对项目所做的更改将导致重新初始化现有订阅,并授予重新初始化订阅所需的权限。

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

  • [ @publisher= ] '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 的值时,系统不执行位更新。这表示使用 sp_changearticle 设置 schema_option 时,可能会关闭现有的位设置。若要保留现有的设置,则应在正在设置的值和 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

0x010x200x20000x4000000x8000000x20000000x80000000x100000000x200000000x400000000x80000000

0x010x200x20000x4000000x8000000x20000000x80000000x100000000x200000000x400000000x80000000

serializable proc exec

0x010x200x20000x4000000x8000000x20000000x80000000x100000000x200000000x400000000x80000000

0x010x200x20000x4000000x8000000x20000000x80000000x100000000x200000000x400000000x80000000

proc schema only

0x010x200x20000x4000000x8000000x20000000x80000000x100000000x200000000x400000000x80000000

0x010x200x20000x4000000x8000000x20000000x80000000x100000000x200000000x400000000x80000000

view schema only

0x010x0100x0200x0400x01000x20000x400000x1000000x2000000x4000000x8000000x20000000x80000000x400000000x80000000

0x010x0100x0200x0400x01000x20000x400000x1000000x2000000x4000000x8000000x20000000x80000000x400000000x80000000

func schema only

0x010x200x20000x4000000x8000000x20000000x80000000x100000000x200000000x400000000x80000000

0x010x200x20000x4000000x8000000x20000000x80000000x100000000x200000000x400000000x80000000

indexed view schema only

0x010x0100x0200x0400x01000x20000x400000x1000000x2000000x4000000x8000000x20000000x80000000x400000000x80000000

0x010x0100x0200x0400x01000x20000x400000x1000000x2000000x4000000x8000000x20000000x80000000x400000000x80000000

注意注意

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

示例

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 [AdventureWorks2008R2]
EXEC sp_changearticle 
  @publication = @publication,
  @article = @article, 
  @property = N'schema_option', 
  @value = @option,
  @force_invalidate_snapshot = 1;
GO

权限

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