创建发布时,可以选择希望发布的表和其他数据库对象。 您可以使用复制来发布下列数据库对象。
| 数据库对象 | 快照复制和事务复制 | 合并复制 |
|---|---|---|
| 表 | X | X |
| 分区表 | X | X |
| 存储过程 - 定义(Transact-SQL 和 CLR) | X | X |
| 存储过程 - 执行(Transact-SQL 和 CLR) | X | 否 |
| 视图 | X | X |
| 索引视图 | X | X |
| 将索引视图用作表 | X | 否 |
| 用户定义类型 (CLR) | X | X |
| 用户自定义函数(Transact-SQL 和 CLR) | X | X |
| 别名数据类型 | X | X |
| 全文索引 | X | X |
| 架构对象(约束、索引、用户 DML 触发器、扩展属性和排序规则) | X | X |
撰写出版物
要创建出版物,请提供以下信息:
- 分发器。
- 快照文件的位置。
- 出版物数据库。
- 要创建的发布类型(快照、事务、带可更新订阅的事务或合并)。
- 要包含在发布中的数据和数据库对象(项目)。
- 用于所有发布类型的静态行筛选器和列筛选器,以及用于合并发布的参数化行筛选器和联接筛选器。
- 快照智能体计划。
- 以下代理运行的账户:快照代理 用于所有出版物;日志读取代理 用于所有事务出版物;队列阅读代理 用于允许更新订阅的交易出版物。
- 该出版物的名称和描述。
有关如何与出版物合作的信息,请参阅以下文章:
注意
删除项目或发布不会从订阅服务器中删除对象。
发布表
最经常发布的对象就是表。 以下链接提供了关于出版表格的更多信息:
当你发布一个用于复制的表时,你可以指定要复制给订阅者的模式对象,比如声明的引用完整性(主键约束、引用约束、唯一约束)、索引、用户DML触发器(DDL触发器不可复制)、扩展属性和排序。 仅在发布服务器和订阅服务器之间的初始同步中复制扩展属性。 如果在初始同步后添加或修改扩展属性,则不会复制更改。
若要指定架构选项,请参阅指定架构选项或 SchemaOption。
分区表和分区索引
复制支持发布分区表和索引。 支持水平取决于你使用的复制类型,以及你为出版物和与分区表相关的文章指定的选项。 有关详细信息,请参阅复制已分区表和索引。
发布存储过程
所有类型的复制都允许你复制存储过程定义:语 CREATE PROCEDURE 句会被复制到每个订阅者。 如果是公共语言运行时 (CLR) 存储过程,则相关联的程序集也要复制。 对过程的更改会复制到订阅服务器;对关联的程序集的更改不会。
除了复制存储过程的定义,通过事务复制还可以复制存储过程的执行。 该功能有助于复制影响大量数据的维护导向存储过程的结果。 有关详细信息,请参阅 在事务复制中发布存储过程执行。
发布视图
各种类型的复制都允许复制视图。 你可以将视图及其索引(如果是索引视图)复制给订阅者,但你也必须复制基表。
对于索引视图,事务复制还允许将其作为表而非视图进行复制,这样就无需再复制基表。 为此,请为 sp_addarticle (Transact-SQL) 的 @type 参数指定“indexed view logbased”选项之一。 有关使用 sp_addarticle 的详细信息,请参阅定义项目。
发布用户自定义函数
将 CLR 函数和 Transact-SQL 函数的 CREATE FUNCTION 语句复制到每个订阅服务器。 对于 CLR 函数,与其关联的程序集也会被复制。 对函数所做的更改会复制到订阅服务器;而对相关程序集的更改则不会被复制。
发布用户定义的类型和别名数据类型
复制将使用用户自定义类型或别名数据类型的列视为其他列,并将其复制给订阅者。 该进程在创建表之前,会在订阅服务器上为每个复制的类型运行 CREATE TYPE 语句。 对于用户自定义类型,复制还会将关联的汇编复制给每个订阅者。 复制不会将用户自定义类型和别名数据类型的更改复制给订阅者。
如果你在数据库中定义了类型,但在创建发布时没有在任何列中引用它,复制不会将该类型复制给订阅者。 如果你以后在数据库中创建该类型的列并想复制它,必须先手动将该类型(以及用户自定义类型的相关汇编)复制给每个订阅者。
发布全文索引
该 CREATE FULLTEXT INDEX 语句将复制到每个订阅服务器,并在订阅服务器上创建全文索引。 使用 ALTER FULLTEXT INDEX 对全文索引所做的更改不会被复制。
对发布的对象进行架构更改
复制支持对已发布对象进行多种架构更改。 当你在SQL Server Publisher对相应的已发布对象进行以下任何模式更改时,复制默认会将该更改传播给所有SQL Server订阅者:
ALTER TABLE
ALTER VIEW
ALTER PROCEDURE
ALTER FUNCTION
ALTER TRIGGER
有关详细信息,请参阅对发布数据库进行架构更改。
出版考虑因素
发布数据库对象时请考虑以下几点:
用户可以在出版物创建和初始快照时访问数据库,但最好在 Publisher 活动较少时创建出版物。
你在数据库中创建了出版物后,不能重新命名数据库。 要重命名数据库,首先必须从数据库中移除复制。
如果你发布的数据库对象依赖于一个或多个其他数据库对象,你必须发布所有被引用的对象。 例如,如果要发布的视图依赖于一个表,则也必须发布该表。
注意
如果你将文章添加到合并出版物中,而现有文章依赖于新文章,你必须使用sp_addmergearticle和sp_changemergearticle的@processing_order参数为两篇文章指定处理顺序。 考虑以下情景:你发布了一个表,但没有发布该表引用的函数。 如果不发布该函数,该表将无法在订阅服务器上创建。 将此函数添加到发布时:为 sp_addmergearticle 的 @processing_order 参数指定值 1;为 sp_changemergearticle 的 @processing_order 参数指定值 2,为参数 @article指定表名称。 这种处理顺序可确保先在订阅服务器端创建该函数,再创建依赖于该函数的表。 每个项目可以使用不同的数字,只要函数的数字小于表的数字即可。
出版物名称不能包含以下字符:% * [ ] |: " ? \ / <>。
发布对象的限制
你能发表的文章和专栏数量因出版类型而异。 有关详细信息,请参阅 SQL Server 的最大容量规范中的“复制对象”部分。
你不能在 SQL Server 复制中发布被定义为带有加密的存储过程、视图、触发器和用户自定义函数。
你可以复制XML模式集合,但初始快照后不会复制变更。
已发布用于事务复制的表必须具有主键。 如果某个表包含在事务复制发布中,则不能禁用与主键列相关联的任何索引。 复制需要这些索引。 若要禁用索引,必须先从发布中删除该表。
用 sp_bindefault(Transact-SQL )创建的绑定默认不会被复制(绑定默认被弃用,取而代之的是用 DEFAULT 关键字 或 ALTER TABLECREATE TABLE创建的默认)。
由于分发代理传递这些对象的顺序所致,你不能将包含针对索引视图的 NOEXPAND 提示的函数,与其引用的表和索引视图一起发布在同一发布中。 若要解决此问题,请将创建的表和索引视图放置于第一个发布中,并且将包含针对索引视图的 NOEXPAND 提示的函数添加到在第一个发布完成后发布的第二个发布中。 或者,为这些函数创建脚本,并且使用 sp_addpublication 的 @post_snapshot_script参数传递该脚本。
架构和对象所有权
在新建发布向导中,复制在架构和对象所有权方面具有以下默认行为:
对于兼容性级别为 90 或更高的合并发布、快照发布和事务发布中的项目:默认情况下,订阅服务器中的对象所有者与发布服务器中相应对象的所有者相同。 如果订阅服务器中不存在拥有对象的架构,将自动创建这些架构。
对于合并发布中兼容级别低于 90 的项目:默认情况下,所有者留空,在订阅服务器上创建该对象时指定为 dbo。
对于 Oracle 发布中的项目:默认情况下,所有者指定为 dbo。
对于使用字母数字模式快照(用于非 SQL Server 订阅服务器以及 SQL Server Compact 订阅服务器)的发布中的项目:默认情况下,所有者保留为空。 所有者默认为与分发智能体或合并智能体连接到订阅服务器所使用的帐户关联的所有者。
你可以通过 文章属性 - <文章> 对话框以及以下存储过程更改对象所有者: sp_addarticle、 sp_addmergearticle、 sp_changearticle和 sp_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_type ( sp_addmergefilter中的参数) 有关这些参数的详细信息,请参阅 sp_addmergearticle (Transact-SQL) 和 sp_addmergefilter (Transact-SQL)。
事务复制和未筛选的合并复制支持在多个发布中发布表,然后在订阅数据库中的单个表内进行订阅(通常称为汇总方案)。 Rollup 通常用于将来自多个位置的数据子集汇总到中央订阅服务器的一张表中。 筛选合并出版物不支持中央订阅者情景。 对于合并复制,汇总通常通过具有参数化行筛选器的单个发布来实现。 有关详细信息,请参阅 参数化行筛选器。