发布数据和数据库对象
创建发布时,可以选择希望发布的表和其他数据库对象。 您可以使用复制来发布下列数据库对象。
Database 对象 | 快照复制和事务复制 | 合并复制 |
---|---|---|
表 | 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) 存储过程,则相关联的程序集也要复制。 对过程的更改将复制到订阅服务器。关联程序集的更改则不然。
除了复制存储过程的定义,通过事务复制还可以复制存储过程的执行。 这对于复制面向维护的存储过程的结果很有用处,这种存储过程的结果会影响大量的数据。 有关详细信息,请参阅 Publishing Stored Procedure Execution in Transactional Replication。
发布视图
各种类型的复制都允许复制视图。 可以将视图(若是索引视图,要连同其所附索引)复制到订阅服务器,同时还必须复制基表。
对于索引视图,事务复制还允许将其作为表而非视图进行复制,这样就无需再复制基表。 为此,请为 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 发布服务器中相应的发布对象进行下列任何一种架构更改时,默认会将该更改传播到所有 SQL Server 订阅服务器:
ALTER TABLE
ALTER VIEW
ALTER PROCEDURE
ALTER FUNCTION
ALTER TRIGGER
有关详细信息,请参阅对发布数据库进行架构更改。
有关发布的注意事项
发布数据库对象时要注意下列问题:
在创建发布和初始快照的过程中,用户可以访问数据库,但建议在发布服务器中活动较少时创建发布。
如果已在数据库中创建了发布,则不能重命名该数据库。 若要对其重命名,必须首先删除数据库中的复制。
如果发布的数据库对象依赖于一个或多个其他数据库对象,则必须发布所有被引用对象。 例如,如果要发布的视图依赖于一个表,则也必须发布该表。
注意
如果向合并发布中添加一个项目和一个依赖于此新项目的现有项目,则必须使用 sp_addmergearticle 和 sp_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 提示的函数添加到在第一个发布完成后发布的第二个发布中。 或者,为这些函数创建脚本,并且使用 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 属性。 如果是这种情况,注意,默认情况下事务复制期望表在订阅服务器中被视为只读表;如果合并复制对事务订阅中的表进行数据更改,则无法实现数据收敛。 为了避免这种情况,建议您在合并发布中将所有此类表都指定为仅供下载。 这样可以防止合并订阅服务器向表中上载数据更改。 有关详细信息,请参阅使用仅下载项目优化合并复制性能。
不能在合并发布和事务发布中同时发布带有排队更新订阅的项目。
支持更新订阅的事务发布所包括的项目不能重新发布。
如果在多个支持排队更新订阅的事务发布中发布项目,那么对于所有发布中的项目,下列属性必须具有相同值:
properties sp_addarticle 中的参数 标识范围管理 @auto_identity_range (已弃用)和 @identityrangemangementoption 发布服务器标识范围 @pub_identity_range 标识范围 @identity_range 标识范围阈值 @threshold 有关这些参数的详细信息,请参阅 sp_addarticle (Transact-SQL)。
如果在多个合并发布中发布项目,那么对于所有发布中的项目,下列属性必须具有相同值:
properties 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)。
事务复制和未筛选的合并复制支持在多个发布中发布表,然后在订阅数据库中的单个表内进行订阅(通常称为“汇总方案”)。 汇总常用于在中央订阅服务器中的一个表中聚合来自多个位置的数据子集。 已筛选的合并发布不支持中央订阅服务器方案。 对于合并复制,通常通过带有参数化行筛选器的单个发布实现汇总。 有关详细信息,请参阅 参数化行筛选器。