发布数据和数据库对象

创建发布时,可以选择要发布的表和其他数据库对象。 可以使用复制发布以下数据库对象。

数据库对象 快照复制和事务复制 合并复制
表格 X X
已分区表 X X
存储过程 - 定义(Transact-SQL 和 CLR) X X
存储过程 - 执行(Transact-SQL 和 CLR) X
浏览量 X X
索引视图 X X
索引视图作为表 X
User-Defined 类型(CLR) X X
User-Defined 函数(Transact-SQL 和 CLR) X X
别名数据类型 X X
全文索引 X X
架构对象(约束、索引、用户 DML 触发器、扩展属性和排序规则) X X

创建出版物

在创建发布时,请提供以下信息:

  • 分销商

  • 快照文件的位置。

  • 出版物数据库。

  • 要创建的发布类型(快照发布、事务性发布、具有可更新订阅的事务性发布或合并发布)。

  • 要包含在出版物中的数据和数据库对象(条目)。

  • 所有出版物类型的静态行筛选器和列筛选器,以及合并出版物的参数化行筛选器和连接筛选器。

  • 快照代理日程。

  • 所有发布中运行快照代理的帐户;所有事务发布中运行日志读取代理的帐户;允许更新订阅的事务发布中运行队列读取代理的帐户。

  • 出版物的名称和描述。

有关如何处理出版物的信息,请参阅以下主题:

注释

删除文章或出版物不会从订阅者中删除对象。

发布表

最常发布的对象是一个表。 以下链接提供与发布表相关领域的更多信息。

发布表以进行复制时,可以指定应将哪些架构对象复制到订阅服务器,例如声明的引用完整性(主键约束、引用约束、唯一约束)、索引、用户 DML 触发器(无法复制 DDL 触发器)、扩展属性和排序规则。 扩展属性仅在发布服务器与订阅服务器之间的初始同步中复制。 如果在初始同步后添加或修改扩展属性,则不会复制更改。

若要指定架构选项,请参阅 “指定架构选项”SchemaOption

分区的表和索引

复制支持发布已分区表和索引。 支持级别取决于所使用的复制类型,以及您为发布和与分区表关联的文章指定的选项。 有关详细信息,请参阅 “复制已分区表和索引”。

发布存储过程

所有类型的复制都允许您复制存储过程定义:`CREATE PROCEDURE` 将被复制到每个订阅者。 在处理公共语言运行时(CLR)存储过程时,关联的程序集也会被复制。 对程序的更改会复制给订阅者,而对关联程序集的更改则不会。

除了复制存储过程的定义外,事务复制还允许复制存储过程的执行。 这对于复制影响大量数据的面向维护的存储过程的结果非常有用。 有关详细信息,请参阅 在事务复制中发布存储过程的执行

发表观点

所有类型的复制都允许复制视图。 视图及其随附的索引(如果它是索引视图)可以复制到订阅者,但基表也必须复制。

对于索引视图,事务复制还允许将索引视图复制为表而不是视图,而无需同时复制基表。 为此,请为sp_addarticle(Transact-SQL)@type参数指定“索引视图基于日志”选项之一。 有关使用 sp_addarticle的详细信息,请参阅 “定义项目”。

发布 User-Defined 函数

CLR 函数和 Transact-SQL 函数的 CREATE FUNCTION 语句会被复制到每个订阅者。 在 CLR 函数的情况下,也会复制相关的程序集。 对函数的更改将复制到订阅者,但对关联程序集的更改不会复制。

发布 User-Defined 类型和别名数据类型

使用用户定义类型或别名数据类型的列将像其他列一样复制到订阅者。 在创建表之前,将在订阅服务器上执行每个复制类型的 CREATE TYPEstatement。 对于用户定义的类型,关联的程序集也会复制到每个订阅者。 用户定义类型和别名数据类型的更改不会复制到订阅者。

如果在数据库中定义了类型,但在创建发布时不会在任何列中引用该类型,则类型不会复制到订阅服务器。 如果随后在数据库中创建这种类型的列并希望复制该类型,则必须首先将该类型和用户定义类型的相关程序集手动复制到每个订阅者。

发布全文索引

CREATE FULLTEXT INDEX 语句将复制到每个订阅服务器,并在订阅服务器上创建全文索引。 不会复制对使用 ALTER FULLTEXT INDEX 的全文索引所做的更改。

对已发布对象进行架构更改

复制支持对已发布对象的各种架构更改。 在 SQL Server 发布服务器上对相应已发布对象进行以下任一架构更改时,该更改默认传播到所有 SQL Server 订阅服务器:

  • 修改表格

  • ALTER VIEW

  • ALTER PROCEDURE

  • 修改函数

  • 修改触发器

有关详细信息,请参阅对发布数据库进行架构更改

发布注意事项

发布数据库对象时,请记住以下问题:

  • 在创建发布和初始快照期间,用户可以访问该数据库,但建议在发布服务器上的较低活动期间创建发布。

  • 发布创建后,无法重命名该数据库。 若要重命名它,必须先从数据库中删除复制。

  • 如果要发布依赖于一个或多个其他数据库对象的数据库对象,则必须发布所有引用的对象。 例如,如果发布依赖于表的视图,则还必须发布该表。

    注释

    如果将项目添加到合并发布和现有项目取决于新项目,则必须使用sp_addmergearticlesp_changemergearticle@processing_order参数为这两个项目指定处理顺序。 请考虑以下方案:发布表,但不发布表引用的函数。 如果不发布函数,则无法在订阅服务器上创建表。 将函数添加到发布时:为 sp_addmergearticle 的 @processing_order 参数指定值 1;并为sp_changemergearticle的 @processing_order 参数指定值 2,并指定参数@article的表名称。 此处理顺序可确保在依赖它的表之前在订阅服务器上创建函数。 只要函数的数字低于表的数字,就可以对每篇文章使用不同的数字。

  • 发布名称不能包含以下字符:% * [ ] |: " ? \ / <>.

发布对象的限制

  • 最大可发布的文章和栏目数量因发布类型而异。 有关详细信息,请参阅 SQL Server 最大容量规范的“复制对象”部分。

  • 存储过程、视图、触发器和用户定义的函数(定义为 WITH ENCRYPTION)不能作为 SQL Server 复制的一部分发布。

  • 可以复制 XML 架构集合,但在初始快照之后不会复制更改。

  • 为事务复制发布的表必须具有主键。 如果表位于事务复制发布中,则不能禁用与主键列关联的任何索引。 复制需要使用这些索引。 若要禁用索引,必须先从发布中删除表。

  • 不会复制使用 sp_bindefault(Transact-SQL) 创建的绑定默认值(绑定默认值已弃用,建议使用 ALTER TABLE 或 CREATE TABLE 语句中 DEFAULT 关键字创建默认值)。

  • 由于分发代理传送索引视图的顺序,包含 NOEXPAND 索引视图提示的函数不能与引用的表和索引视图在同一发布中发布。 若要解决此问题,请先将表和索引视图的创建放在一个初次发布中,然后在第一个发布完成后,将包含 NOEXPAND 索引视图提示的函数添加到第二个发布中。 或者,为这些函数创建脚本,并使用 的 @post_snapshot_script 参数 sp_addpublication传递脚本。

架构和对象所有权

对于架构和对象所有权,复制在新发布向导中具有以下默认行为:

  • 对于兼容级别为 90 或更高、快照发布和事务发布的合并发布中的项目:默认情况下,订阅服务器上的对象所有者与发布服务器上的相应对象的所有者相同。 如果拥有对象的架构在订阅服务器上不存在,则会自动创建它们。

  • 对于兼容级别低于 90 的合并发布中的项目:默认情况下,所有者留空,并在订阅服务器上创建对象期间指定为 dbo

  • 对于 Oracle 发布中的项目:默认情况下,所有者指定为 dbo

  • 对于使用字符模式快照(用于非 SQL Server 订阅服务器和 SQL Server Compact 订阅服务器)的出版物中的文章,默认情况下,所有者默认留空。 所有者默认为与分发代理或合并代理用于连接到订阅服务器的帐户关联的所有者。

对象所有者可以通过 “项目属性 - <项目> ”对话框和以下存储过程进行更改: sp_addarticlesp_addmergearticlesp_changearticlesp_changemergearticle。 有关详细信息,请参阅 “查看和修改发布属性”、“ 定义项目”和 “查看和修改项目属性”。

将数据发布到运行以前版本的 SQL Server 的订阅服务器

  • 如果要发布到运行以前版本的 SQL Server 的订阅服务器,则仅限于该版本的功能,无论是特定于复制的功能还是整个产品的功能。

  • 合并发布使用兼容级别,以确定可以在发布中使用哪些功能,并允许支持运行以前版本 SQL Server 的订阅者。

在多个刊物中刊登表格

复制支持在多个刊物中发布文章(包括重新发布数据),但须遵守以下限制:

  • 如果一篇文章同时在事务性发布和合并发布中发表,请确保合并文章的 @published_in_tran_pub 属性设置为 TRUE。 有关设置属性的详细信息,请参阅 “查看和修改发布属性 ”和 “查看和修改项目属性”。

    如果文章是事务订阅的一部分,并且包含在合并发布中,则还应设置 @published_in_tran_pub 属性。 如果是这样,请注意,默认情况下,事务复制期望订阅服务器上的表被视为只读;如果合并复制对事务订阅中的表进行数据更改,则可能导致数据不同步的情况。 为了避免这种可能性,我们建议在合并发布中将任何此类表指定为仅下载表。 这样可以阻止合并订阅者将数据更改上传到表。 有关详细信息,请参阅使用仅下载项目优化合并复制性能

  • 文章不能同时被发布在合并发布和具有队列更新订阅的事务发布中。

  • 在支持更新订阅的事务性出版物中包含的文章无法重新发布。

  • 如果一篇文章在多个支持排队更新订阅的事务性发布中被发布,那么该文章在所有发布中的属性必须具有相同的值:

    资产 sp_addarticle中的参数
    标识范围管理 @auto_identity_range (已弃用)和 @identityrangemangementoption
    发布者标识范围 @pub_identity_range
    标识范围 @identity_range
    标识范围阈值 @threshold

    有关这些参数的详细信息,请参阅sp_addarticle(Transact-SQL)。

  • 如果项目在多个合并发布中发布,则所有发布中的项目必须具有相同的值:

    资产 sp_addmergearticle 中的参数
    列跟踪 @column_tracking
    架构选项 @schema_option
    列筛选 @vertical_partition
    订阅服务器上传选项 @subscriber_upload_options
    条件删除跟踪 @delete_tracking
    错误补偿 @compensate_for_errors
    标识范围管理 @auto_identity_range (已弃用)和 @identityrangemangementoption
    发布者标识范围 @pub_identity_range
    标识范围 @identity_range
    标识范围阈值 @threshold
    分区选项 @partition_options
    Blob 列流式处理 @stream_blob_columns
    筛选器类型 @filter_typesp_addmergefilter中的参数)

    有关这些参数的详细信息,请参阅sp_addmergearticle(Transact-SQL)sp_addmergefilter(Transact-SQL)。

  • 事务复制和未筛选的合并复制支持在多个发布中发布表,随后可在订阅数据库中的单个表内进行订阅(通常称为汇总使用场景)。 汇总运算通常用于在一个中心订阅端的表中聚合来自多个位置的数据子集。 筛选合并发布不支持中央订阅者方案。 对于合并复制,汇总通常通过具有参数化行筛选器的单个发布来实现。 有关详细信息,请参阅 参数化行筛选器

另请参阅

向现有出版物添加文章并删除文章
配置分发
初始化订阅
脚本复制
保护发布者
订阅刊物