sp_addarticle (Transact-SQL)

创建项目并将其添加到发布中。此存储过程在发布服务器上对发布数据库执行。

主题链接图标Transact-SQL 语法约定

语法

sp_addarticle [ @publication = ] 'publication' 
        , [ @article = ] 'article' 
    [ , [ @source_table = ] 'source_table' ]
    [ , [ @destination_table = ] 'destination_table' ] 
    [ , [ @vertical_partition = ] 'vertical_partition' ] 
    [ , [ @type = ] 'type' ] 
    [ , [ @filter = ] 'filter' ] 
    [ , [ @sync_object= ] 'sync_object' ] 
        [ , [ @ins_cmd = ] 'ins_cmd' ] 
    [ , [ @del_cmd = ] 'del_cmd' ] 
        [ , [ @upd_cmd = ] 'upd_cmd' ] 
    [ , [ @creation_script = ] 'creation_script' ] 
    [ , [ @description = ] 'description' ] 
    [ , [ @pre_creation_cmd = ] 'pre_creation_cmd' ] 
    [ , [ @filter_clause = ] 'filter_clause' ] 
    [ , [ @schema_option = ] schema_option ] 
    [ , [ @destination_owner = ] 'destination_owner' ] 
    [ , [ @status = ] status ] 
    [ , [ @source_owner = ] 'source_owner' ] 
    [ , [ @sync_object_owner = ] 'sync_object_owner' ] 
    [ , [ @filter_owner = ] 'filter_owner' ] 
    [ , [ @source_object = ] 'source_object' ] 
    [ , [ @artid = ] article_ID  OUTPUT ] 
    [ , [ @auto_identity_range = ] 'auto_identity_range' ] 
    [ , [ @pub_identity_range = ] pub_identity_range ] 
    [ , [ @identity_range = ] identity_range ] 
    [ , [ @threshold = ] threshold ] 
    [ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
    [ , [ @use_default_datatypes = ] use_default_datatypes
    [ , [ @identityrangemanagementoption = ] identityrangemanagementoption ]
    [ , [ @publisher = ] 'publisher' ]
    [ , [ @fire_triggers_on_snapshot = ] 'fire_triggers_on_snapshot' ] 

参数

  • [ @publication = ] 'publication'
    包含项目的发布的名称。该名称在数据库中必须是唯一的。publication 的数据类型为 sysname,无默认值。

  • [ @article = ] 'article'
    项目的名称。该名称在发布中必须是唯一的。article 的数据类型为 sysname,无默认值。

  • [ @source_table = ] 'source_table'
    不推荐使用此参数;改用 source_object。

    支持此参数只是为了向后与 SQL Server 6.5 兼容。Oracle 发布服务器不支持此参数。

  • [ @destination_table = ] 'destination_table'
    与 source_table或存储过程不同的目标(订阅)表的名称。destination_table 的数据类型为 sysname,默认值为 NULL,这表示 source_table 等于 destination_table。

  • [ @vertical_partition = ] 'vertical_partition'
    启用和禁用对表项目的列筛选。vertical_partition 的数据类型为 nchar(5),默认值为 FALSE。

    False 指示不进行垂直筛选,而发布所有列。

    true 将清除除声明的主键、没有默认值并且可为空的列以及唯一的键列以外的所有列。添加列时需要使用 sp_articlecolumn

  • [ @type = ] 'type'
    项目的类型。type 的数据类型为 sysname,可以是下列值之一:

    说明

    aggregate schema only

    仅具有架构的聚合函数。

    func schema only

    仅具有架构的函数。

    indexed view logbased

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

    indexed view logbased manualboth

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

    indexed view logbased manualfilter

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

    indexed view logbased manualview

    具有手动视图并且基于日志的索引视图项目。该选项需要指定 sync_object 参数。对于此类型的项目,不需要单独发布基表。Oracle 发布服务器不支持。

    indexed view schema only

    仅具有架构的索引视图。对于此类型的项目,还必须发布基表。

    logbased(默认值)

    基于日志的项目。

    logbased manualboth

    具有手动筛选器和手动视图并且基于日志的项目。该选项需要指定 sync_object 和 filter 参数。Oracle 发布服务器不支持。

    logbased manualfilter

    具有手动筛选器并且基于日志的项目。该选项需要指定 sync_object 和 filter 参数。Oracle 发布服务器不支持。

    logbased manualview

    具有手动视图并且基于日志的项目。该选项需要指定 sync_object 参数。Oracle 发布服务器不支持。

    proc exec

    将存储过程的执行复制到项目的所有订阅服务器。Oracle 发布服务器不支持。建议您使用选项“serializable proc exec”,而不是 proc exec。有关详细信息,请参阅在事务复制中发布存储过程执行中的“存储过程执行项目的类型”。

    proc schema only

    仅具有架构的过程。Oracle 发布服务器不支持。

    serializable proc exec

    仅当存储过程在可串行事务上下文内执行时才复制存储过程的执行。Oracle 发布服务器不支持。

    view schema only

    仅具有架构的视图。Oracle 发布服务器不支持。使用此选项时,还必须发布基表。

  • [ @filter = ] 'filter'
    用于水平筛选表的存储过程(使用 FOR REPLICATION 创建)。filter 的数据类型为 nvarchar(386),默认值为 NULL。必须手动执行 sp_articleviewsp_articlefilter 才能创建视图和筛选存储过程。如果不为 NULL,则不创建筛选过程(假定存储过程是手动创建的)。

  • [ @sync_object = ] 'sync_object'
    表或视图的名称,该表或视图用于生成用来表示该项目快照的数据文件。sync_object 的数据类型为 nvarchar(386),默认值为 NULL。如果为 NULL,则调用 sp_articleview 以自动创建用来生成输出文件的视图。这发生在用 sp_articlecolumn 添加任何列之后。如果不为 NULL,则不创建视图(假定视图是手动创建的)。

  • [ @ins_cmd = ] 'ins_cmd'
    复制该项目的插入时所使用的复制命令类型。ins_cmd 的数据类型为 nvarchar(255),可以是下列值之一:

    说明

    NONE

    不执行任何操作。

    CALL sp_MSins_table(默认值)

    -或-

    CALL custom_stored_procedure_name

    在订阅服务器中调用要执行的存储过程。若要使用该复制方法,请使用 schema_option 来指定自动创建存储过程,或在项目的每个订阅服务器的目标数据库中创建指定的存储过程。custom_stored_procedure 是用户创建的存储过程的名称。sp_MSins_table 包含目标表的名称,用于代替参数的 _table 部分。如果指定了 destination_owner,则它将置于目标表名称之前。例如,对于订阅服务器中 Production 架构拥有的 ProductCategory 表,该参数应为 CALL sp_MSins_ProductionProductCategory。对于对等复制拓扑中的项目,_table 后将追加 GUID 值。对于更新订阅服务器,不支持指定 custom_stored_procedure。

    SQL 或 NULL

    复制 INSERT 语句。需要为 INSERT 语句提供项目中发布的所有列的值。对插入复制以下命令:

    INSERT INTO <table name> VALUES (c1value, c2value, c3value, ..., cnvalue)

    有关详细信息,请参阅指定如何传播事务性项目的更改

  • [ @del_cmd =] 'del_cmd'
    复制该项目的删除时所使用的复制命令类型。del_cmd 的数据类型为 nvarchar(255),可以是下列值之一:

    说明

    NONE

    不执行任何操作。

    CALLsp_MSdel_table(默认值)

    -或-

    CALL custom_stored_procedure_name

    在订阅服务器中调用要执行的存储过程。若要使用该复制方法,请使用 schema_option 来指定自动创建存储过程,或在项目的每个订阅服务器的目标数据库中创建指定的存储过程。custom_stored_procedure 是用户创建的存储过程的名称。sp_MSdel_table 包含目标表的名称,用于代替参数的 _table 部分。如果指定了 destination_owner,则它将置于目标表名称之前。例如,对于订阅服务器中 Production 架构拥有的 ProductCategory 表,该参数应为 CALL sp_MSdel_ProductionProductCategory。对于对等复制拓扑中的项目,_table 后将追加 GUID 值。对于更新订阅服务器,不支持指定 custom_stored_procedure。

    XCALL sp_MSdel_table

    -或-

    XCALL custom_stored_procedure_name

    采用 XCALL 样式参数调用存储过程。若要使用该复制方法,请使用 schema_option 来指定自动创建存储过程,或在项目的每个订阅服务器的目标数据库中创建指定的存储过程。对于更新订阅服务器,不允许指定用户创建的存储过程。

    SQL 或 NULL

    复制 DELETE 语句。为 DELETE 语句提供所有主键列值。对删除复制以下命令:

    DELETE FROM <table name> WHERE pkc1 = pkc1value AND pkc2 = pkc2value AND pkcn = pkcnvalue

    有关详细信息,请参阅指定如何传播事务性项目的更改

  • [ @upd_cmd =] 'upd_cmd'
    复制该项目的更新时所使用的复制命令类型。upd_cmd 的数据类型为 nvarchar(255),可以是下列值之一:

    说明

    NONE

    不执行任何操作。

    CALL sp_MSupd_table

    -或-

    CALL custom_stored_procedure_name

    在订阅服务器中调用要执行的存储过程。若要使用该复制方法,请使用 schema_option 来指定自动创建存储过程,或在项目的每个订阅服务器的目标数据库中创建指定的存储过程。

    MCALL sp_MSupd_table

    -或-

    MCALL custom_stored_procedure_name

    采用 MCALL 样式参数调用存储过程。若要使用该复制方法,请使用 schema_option 来指定自动创建存储过程,或在项目的每个订阅服务器的目标数据库中创建指定的存储过程。custom_stored_procedure 是用户创建的存储过程的名称。sp_MSupd_table 包含目标表的名称,用于代替参数的 _table 部分。如果指定了 destination_owner,则它将置于目标表名称之前。例如,对于订阅服务器中 Production 架构拥有的 ProductCategory 表,该参数应为 MCALL sp_MSupd_ProductionProductCategory。对于对等复制拓扑中的项目,_table 后将追加 GUID 值。对于更新订阅服务器,不允许指定用户创建的存储过程。

    SCALL sp_MSupd_table(默认值)

    -或-

    SCALL custom_stored_procedure_name

    采用 SCALL 样式参数调用存储过程。若要使用该复制方法,请使用 schema_option 来指定自动创建存储过程,或在项目的每个订阅服务器的目标数据库中创建指定的存储过程。custom_stored_procedure 是用户创建的存储过程的名称。sp_MSupd_table 包含目标表的名称,用于代替参数的 _table 部分。如果指定了 destination_owner,则它将置于目标表名称之前。例如,对于订阅服务器中 Production 架构拥有的 ProductCategory 表,该参数应为 SCALL sp_MSupd_ProductionProductCategory。对于对等复制拓扑中的项目,_table 后将追加 GUID 值。对于更新订阅服务器,不允许指定用户创建的存储过程。

    XCALL sp_MSupd_table

    -或-

    XCALL custom_stored_procedure_name

    采用 XCALL 样式参数调用存储过程。若要使用该复制方法,请使用 schema_option 来指定自动创建存储过程,或在项目的每个订阅服务器的目标数据库中创建指定的存储过程。对于更新订阅服务器,不允许指定用户创建的存储过程。

    SQL 或 NULL

    复制 UPDATE 语句。UPDATE 语句在所有的列值和主键列值中提供。对更新复制以下命令:

    UPDATE <table name> SET c1 = c1value, SET c2 = c2value, SET cn = cnvalue WHERE pkc1 = pkc1value AND pkc2 = pkc2value AND pkcn = pkcnvalue
    注意注意

    对于传播到订阅服务器的数据量,CALL、MCALL、SCALL 和 XCALL 语法各不相同。CALL 语法传递所有已插入和已删除的列的所有值。SCALL 语法只传递受影响的列的值。XCALL 语法传递所有列的值(无论更改与否),包括列以前的值。有关详细信息,请参阅指定如何传播事务性项目的更改

  • [ @creation_script =] 'creation_script'
    用于创建订阅数据库中项目的可选项目架构脚本的路径和名称。creation_script 的数据类型为 nvarchar(255),默认值为 NULL。

  • [ @description =] 'description'
    项目的说明项。description 的数据类型为 nvarchar(255),默认值为 NULL。

  • [ @pre_creation_cmd =] 'pre_creation_cmd'
    指定在应用该项目的快照时,如果系统在订阅服务器中检测到同名的现有对象,则应该执行的操作。pre_creation_cmd 的数据类型为 nvarchar(10),可以是下列值之一:

    说明

    none

    不使用命令。

    delete

    在应用快照之前从目标表中删除数据。水平筛选项目时,将只删除筛选子句所指定的列中的数据。定义水平筛选时,不支持用于 Oracle 发布服务器。

    drop(默认值)

    删除目标表。

    truncate

    截断目标表。对 ODBC 或 OLE DB 订阅服务器无效。

  • [ @filter_clause=] 'filter_clause'
    是定义水平筛选器的限制 (WHERE) 子句。当输入限制子句时,将省略关键字 WHERE。filter_clause 的数据类型为 ntext,默认值为 NULL。有关详细信息,请参阅筛选已发布数据

  • [ @schema_option =] schema_option
    给定项目的架构生成选项的位掩码。schema_option 的数据类型为 binary(8),并且可以是具有下列一个或多个值的 | (Bitwise OR) 产品:

    注意注意

    如果该值为 NULL,则系统将为依赖于其他项目属性的项目自动生成有效的架构选项。“备注”中给出的“默认架构选项”表列出了基于项目类型和复制类型的组合所选择的值。

    说明

    0x00

    禁用快照代理编写脚本功能并使用 creation_script。

    0x01

    生成对象创建脚本(CREATE TABLE、CREATE PROCEDURE 等)。该值是存储过程项目的默认值。

    0x02

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

    0x04

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

    0x08

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

    0x10

    生成对应的聚集索引。即使不设置此选项,但如果已在已发布的表中定义与主键相关的索引以及唯一约束,那么也会生成它们。

    0x20

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

    0x40

    生成相应的非聚集索引。即使不设置此选项,但如果已在已发布的表中定义与主键相关的索引以及唯一约束,那么也会生成它们。

    0x80

    复制主键约束。即使不启用选项 0x100x40,仍将复制与约束相关的任何索引。

    0x100

    如果已定义,则复制表项目的用户触发器。Oracle 发布服务器不支持

    0x200

    复制外键约束。如果所引用的表不是发布的一部分,则不会复制已发布表的任何 FOREIGN KEY 约束。Oracle 发布服务器不支持

    0x400

    复制检查约束。Oracle 发布服务器不支持

    0x800

    复制默认值。Oracle 发布服务器不支持

    0x1000

    复制列级排序规则。

    注意注意
    应当为 Oracle 发布服务器设置该选项,以启用区分大小写的比较。

    0x2000

    复制与已发布项目源对象关联的扩展属性。Oracle 发布服务器不支持

    0x4000

    复制 UNIQUE 约束。即使不启用选项 0x100x40,仍将复制与约束相关的任何索引。

    0x8000

    此选项对 SQL Server 2005 发布服务器无效。

    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 属性。有关该属性的详细信息,请参阅使用稀疏列

    NULL

    复制过程会自动将 schema_option 设置为默认值,其值依赖于其他项目属性。“备注”部分的“默认架构选项”表根据项目类型和复制类型列出了默认架构选项。

    非 SQL Server 发布的默认值是 0x050D3

    并非所有 schema_option 值对每个复制类型和项目类型都有效。“备注”中给出的**“有效架构选项”**表列出了基于项目类型和复制类型的组合所选择的有效架构选项。

  • [ @destination_owner =] 'destination_owner'
    目标对象的所有者的名称。destination_owner 的数据类型为 sysname,默认值为 NULL。如果未指定 destination_owner,则基于下列规则自动指定所有者:

    条件

    目标对象所有者

    发布使用本机模式的大容量复制来生成初始快照,该快照只支持 SQL Server 订阅服务器。

    默认使用 source_owner 的值。

    从非 SQL Server 发布服务器发布。

    默认值为目标数据库的所有者。

    发布使用字符模式的大容量复制来生成初始快照,该快照支持非 SQL Server 订阅服务器。

    不分配。

    若要支持非 SQL Server 订阅服务器,destination_owner 必须为 NULL。

  • [ @status=] status
    指定项目是否是活动的,以及其他如何传播更改的选项。status 的数据类型为 tinyint,并且可以是具有下列一个或多个值的 | (Bitwise OR) 产品。

    说明

    1

    项目是活动的。

    8

    在 INSERT 语句中包含列名。

    16(默认值)

    使用参数化语句。

    24

    在 INSERT 语句中包含列名,并使用参数化语句。

    64

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

    例如,对于使用参数化语句的活动项目,此列中的值为 17。如果值为 0,则表示项目处于非活动状态,而且未定义其他属性。

  • [ @source_owner =] 'source_owner'
    源对象的所有者。source_owner 的数据类型为 sysname,默认值为 NULL。必须为 Oracle 发布服务器指定 source_owner。

  • [ @sync_object_owner =] 'sync_object_owner'
    用来定义发布项目的视图的所有者。sync_object_owner 的数据类型为 sysname,默认值为 NULL。

  • [ @filter_owner =] 'filter_owner'
    筛选器的所有者。filter_owner 的数据类型为 sysname,默认值为 NULL。

  • [ @source_object =] 'source_object'
    要发布的数据库对象。source_object 的数据类型为 sysname,默认值为 NULL。如果 source_table 为 NULL,则 source_object 不能为 NULL。应当使用 source_object 代替 source_table。有关可以使用快照或事务复制进行发布的对象的类型的详细信息,请参阅发布数据和数据库对象

  • [ @artid = ] article_ID OUTPUT
    新项目的 ID。article_ID 的数据类型为 int,默认值为 NULL,它是 OUTPUT 参数。

  • [ @auto_identity_range = ] 'auto_identity_range'
    启用和禁用在创建发布时对发布的自动标识范围处理。auto_identity_range 的数据类型为 nvarchar(5),可以是下列值之一:

    说明

    true

    启用自动标识范围处理

    false

    禁用自动标识范围处理

    NULL(默认值)

    标识范围处理由 identityrangemanagementoption 设置。

    注意注意

    不推荐使用 auto_identity_range,提供此参数只是为了向后兼容。应使用 identityrangemanagementoption 来指定标识范围管理选项。有关详细信息,请参阅复制标识列

  • [ @pub_identity_range = ] pub_identity_range
    如果将项目的 identityrangemanagementoption 设置为 auto 或将 auto_identity_range 设置为 true,则控制发布服务器中的范围大小。pub_identity_range 的数据类型为 bigint,默认值为 NULL。Oracle 发布服务器不支持。

  • [ @identity_range = ] identity_range
    如果将项目的 identityrangemanagementoption 设置为 auto 或将 auto_identity_range 设置为 true,则控制订阅服务器中的范围大小。identity_range 的数据类型为 bigint,默认值为 NULL。当 auto_identity_range 设置为 true 时使用。Oracle 发布服务器不支持。

  • [ @threshold = ] threshold
    百分比值,用于控制分发代理何时分配新标识范围。如果使用 threshold 中指定的百分比值,则分发代理将创建新的标识范围。threshold 的数据类型为 bigint,默认值为 NULL。当 identityrangemanagementoption 设置为 auto 或 auto_identity_range 设置为 true 时使用。Oracle 发布服务器不支持。

  • [ @force_invalidate_snapshot = ] force_invalidate_snapshot
    确认此存储过程所执行的操作是否会使现有快照失效。force_invalidate_snapshot 的数据类型为 bit,默认值为 0。

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

    1 指定:添加项目可能导致快照无效,如果存在需要新快照的订阅,则为要标记为过时的现有快照和要生成的新快照进行授权。

  • [ @use_default_datatypes = ] use_default_datatypes
    当从 Oracle 发布服务器发布项目时,是否使用默认的列数据类型映射。use_default_datatypes 的数据类型为 bit,默认值为 1。

    1 = 使用默认项目列映射。通过执行 sp_getdefaultdatatypemapping,可以显示默认数据类型映射。

    0 = 定义了自定义项目列映射,因此 sp_addarticle 不调用 sp_articleview

    如果 use_default_datatypes 设置为 0,则必须对每个要从默认值更改为其他值的列映射执行一次 sp_changearticlecolumndatatype。已定义所有自定义列映射之后,必须执行 sp_articleview

    注意注意

    该参数只应当用于 Oracle 发布服务器。对于 SQL Server 发布服务器,如果将 use_default_datatypes 设置为 0,将生成错误。

  • [ @identityrangemanagementoption = ] identityrangemanagementoption
    指定如何处理项目的标识范围管理。identityrangemanagementoption 的数据类型为 nvarchar(10),可以是下列值之一:

    说明

    none

    复制不会显式执行标识范围管理。仅当为了保持与 SQL Server 早期版本的向后兼容性时,才建议使用该选项。禁止用于对等复制。

    manual

    使用 NOT FOR REPLICATION 标记标识列,以启用手动标识范围处理。

    auto

    指定自动管理标识范围。

    NULL(默认值)

    如果 auto_identity_range 的值不是 true,则默认值为 none。在对等拓扑默认(忽略 auto_identity_range)中,默认值为 manual。

    为了向后兼容,当 identityrangemanagementoption 值为 NULL 时,将检查 auto_identity_range 值。不过,在 identityrangemanagementoption 值不为 NULL 时,则忽略 auto_identity_range 的值。

    有关详细信息,请参阅复制标识列

  • [ @publisher = ] 'publisher'
    指定一个非 SQL Server 发布服务器。publisher 的数据类型为 sysname,默认值为 NULL。

    注意注意

    向 SQL Server 发布服务器中添加项目时,不应使用 publisher。

  • [ @fire_triggers_on_snapshot = ] 'fire_triggers_on_snapshot'
    在应用初始快照时,是否执行所复制的用户触发器。fire_triggers_on_snapshot 的数据类型为 nvarchar(5),默认值为 FALSE。true 表示在应用快照时将执行复制的表中的用户触发器。为了复制触发器,schema_option 的位掩码值必须包括值 0x100

返回代码值

0(成功)或 1(失败)

注释

sp_addarticle 用于快照复制或事务复制。

默认情况下,如果复制不支持列数据类型,则复制不发布源表中的任何列。如果需要发布这样的列,则必须执行 sp_articlecolumn 才能添加列。有关详细信息,请参阅所有类型复制的注意事项

将项目添加到支持对等事务复制的发布中时,将应用下列限制:

  • 必须为所有基于日志的项目指定参数化语句。必须在 status 值中包括 16

  • 目标表的名称和所有者必须与源表匹配。

  • 不能水平或垂直筛选项目。

  • 不支持自动标识范围管理。必须将 identityrangemanagementoption 的值指定为手动。

  • 如果表中存在 timestamp 列,则必须在 schema_option 中包括 0x08,才能将列作为 timestamp 进行复制。

  • 不能为 ins_cmd、upd_cmd 和 del_cmd 指定值 SQL

有关详细信息,请参阅对等事务复制

发布对象时,对象的定义会复制到订阅服务器。如果要发布的数据库对象依赖于一个或多个其他对象,则必须发布所有被引用对象。例如,如果要发布的视图依赖于一个表,则也必须发布该表。

如果 vertical_partition 设置为 true,则 sp_addarticle 将视图的创建推迟到调用 sp_articleview 时(添加最后一个 sp_articlecolumn 之后)。

如果发布允许更新订阅,并且已发布的表没有 uniqueidentifier 列,则 sp_addarticle 会自动将 uniqueidentifier 列添加到表中。

复制到不是 SQL Server 实例的订阅服务器(异类复制)时,仅对于 INSERT、UPDATE 和 DELETE 命令支持 Transact-SQL 语句。

运行日志读取器代理时,将项目添加到对等发布可能会导致日志读取器代理和添加项目的进程之间的死锁。为了避免此问题,在将项目添加到对等发布前,请使用复制监视器停止要添加项目的节点上的日志读取器代理。添加项目后重新启动该日志读取器代理。

默认架构选项

该表说明了当用户未指定 schema_options 时复制所设置的默认值,这种情况下,该值取决于复制类型(沿顶部显示)和项目类型(显示在第一列中)。

项目类型

复制类型

 

 

事务

快照

aggregate schema only

0x01

0x01

func schema only

0x01

0x01

indexed view schema only

0x01

0x01

indexed view logbased

0x30F3

0x3071

indexed view logbase manualboth

0x30F3

0x3071

indexed view logbased manualfilter

0x30F3

0x3071

indexed view logbased manualview

0x30F3

0x3071

logbased

0x30F3

0x3071

logbased manualfilter

0x30F3

0x3071

logbased manualview

0x30F3

0x3071

proc exec

0x01

0x01

proc schema only

0x01

0x01

serializable proc exec

0x01

0x01

view schema only

0x01

0x01

注意注意

如果对排队更新启用发布,则将 schema_option 的值 0x80 添加到表中所显示的默认值中。对于非 SQL Server 发布,默认 schema_option 为 0x050D3

有效架构选项

此表按复制类型(在顶部横向显示)和项目类型(在第一列纵向显示)说明了 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 的值 0x80000x80。非 SQL Server 发布支持的 schema_option 值包括:0x010x020x100x400x800x10000x40000X8000

示例

DECLARE @publication    AS sysname;
DECLARE @table AS sysname;
DECLARE @filterclause AS nvarchar(500);
DECLARE @filtername AS nvarchar(386);
DECLARE @schemaowner AS sysname;
SET @publication = N'AdvWorksProductTran'; 
SET @table = N'Product';
SET @filterclause = N'[DiscontinuedDate] IS NULL'; 
SET @filtername = N'filter_out_discontinued';
SET @schemaowner = N'Production';

-- Add a horizontally and vertically filtered article for the Product table.
-- Manually set @schema_option to ensure that the Production schema 
-- is generated at the Subscriber (0x8000000).
EXEC sp_addarticle 
    @publication = @publication, 
    @article = @table, 
    @source_object = @table,
    @source_owner = @schemaowner, 
    @schema_option = 0x80030F3,
    @vertical_partition = N'true', 
    @type = N'logbased',
    @filter_clause = @filterclause;

-- (Optional) Manually call the stored procedure to create the 
-- horizontal filtering stored procedure. Since the type is 
-- 'logbased', this stored procedures is executed automatically.
EXEC sp_articlefilter 
    @publication = @publication, 
    @article = @table, 
    @filter_clause = @filterclause, 
    @filter_name = @filtername;

-- Add all columns to the article.
EXEC sp_articlecolumn 
    @publication = @publication, 
    @article = @table;

-- Remove the DaysToManufacture column from the article
EXEC sp_articlecolumn 
    @publication = @publication, 
    @article = @table, 
    @column = N'DaysToManufacture', 
    @operation = N'drop';

-- (Optional) Manually call the stored procedure to create the 
-- vertical filtering view. Since the type is 'logbased', 
-- this stored procedures is executed automatically.
EXEC sp_articleview 
    @publication = @publication, 
    @article = @table,
    @filter_clause = @filterclause;
GO

权限

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