Oracle 发布服务器的设计注意事项和限制
在设计上,从 Oracle 数据库中进行发布与从 Microsoft SQL Server 数据库中进行发布几乎一样。 不过,还应注意下列限制和问题:
“Oracle Gateway”选项的性能优于“Oracle Complete”选项;但是,此选项不能用于在多个事务发布中发布同一个表。 一个表最多只能出现在一个事务发布中,但可以出现在任意多个快照发布中。 如果需要在多个事务发布中发布同一个表,请选择“Oracle Complete”选项。
复制支持发布表、索引和具体化视图, 不能复制其他对象。
Oracle 数据库与 SQL Server 数据库在对数据的存储和处理方面有一些会影响复制的小差异。
当使用 Oracle 发布服务器时,在如何支持事务复制功能方面存在一些差异。
支持从 Oralce 中发布对象
复制支持从 Oracle 数据库中复制下列对象:
表
按照索引组织的表
索引
具体化视图(按表复制)
下列内容可以出现在已发布表上,但不会复制这些内容:
基于域的索引
基于函数的索引
默认值
检查约束
外键
存储选项(表空间、群集等)
不能复制下列对象:
嵌套表
视图
包、包正文、过程和触发器
队列
序列
同义词
有关支持的数据类型的信息,请参阅 Data Type Mapping for Oracle Publishers。
Oracle 和 SQL Server 之间的区别
Oracle 对某些对象有不同的最大大小限制。 在 Oracle 发布数据库中创建的任何对象都应遵守 SQL Server中相应对象的最大大小限制。 若要了解 SQL Server 中的限制,请参阅 SQL Server 的最大容量规范。
默认情况下,Oracle 对象的名称用大写字母创建。 通过 SQL Server 分发服务器发布 Oracle 对象时,如果这些对象的名称在 Oracle 数据库中为大写,则必须确保以大写形式提供这些对象的名称。 如果不按正确的大小写指定对象,可能会产生错误消息,指示找不到对象。
Oracle 和 SQL Server在 SQL 语言上稍有差别,行筛选器应以与 Oracle 兼容的语法编写。
大型对象的注意事项
大型对象 (LOB) 数据并不存储在项目日志表中,LOB 数据的更新始终是从已发布的表中直接检索的。 只有当影响 LOB 的操作激发了复制的表上的复制触发器时,才会在事务发布中复制更新。 插入或删除包含 LOB 的行时,将激发 Oracle 触发器;但更新 LOB 列并不会激发触发器。 只有在同一 Oracle 事务中同时更新同一行的 LOB 列和非 LOB 列时,才会立即复制 LOB 列的更新。 否则,只有在下一次更新该行中的非 LOB 列时,才会刷新订阅服务器中的 LOB 列。 请确保您的应用程序可以接受此行为。
若要在事务发布中复制 LOB 列的更新,请在编写应用程序时考虑使用下列策略之一:
在事务中删除并重新插入行,而不是更新行:重新插入行时指定新的 LOB。 因为删除和插入操作都会激发触发器,所以将复制行。
除了 LOB 列外,还要在行更新中包括一个非 LOB 列,或在同一 Oracle 事务中更新该行的非 LOB 列。 在这两种情况下,更新非 LOB 列可确保激发触发器。
有关 LOB 的详细信息,请参阅 Data Type Mapping for Oracle Publishers。
唯一索引和约束
对于快照和事务复制,唯一索引和约束(包括主键约束)中包含的列必须遵守特定的限制。 如果不遵守这些限制,将不复制约束或索引。
SQL Server 索引中允许的最大列数为 16。
唯一约束中包含的所有列都必须具有支持的数据类型。 有关数据类型的详细信息,请参阅 Data Type Mapping for Oracle Publishers。
唯一约束中包含的所有列都必须发布(不能进行筛选)。
唯一约束或索引中包含的列都不应为 Null。
还要考虑下列问题:
Oracle 和 SQL Server 处理 NULL 的方式有所不同:对于允许 NULL 值并包含在唯一约束或索引中的列,Oracle 允许存在多个值为 NULL 的行。 而在SQL Server 中,同一列只允许存在一个值为 NULL 的行,以确保唯一性。 不能发布允许 NULL 值的唯一约束或索引,因为对于索引或约束中包含的任何列,如果已发布的表中包含多个值为 NULL 的行,订阅服务器中将出现违反约束的情况。
测试唯一性时, SQL Server 将忽略字段中的尾随空格,而 Oracle 则不会忽略。
与在 SQL Server 事务复制中一样,Oracle 事务发布中的表需要具有主键;根据上述规则,主键必须唯一。 如果主键不符合上述规则,则不能为事务复制发布表。
Oracle 发布与标准事务复制之间的区别
Oracle 发布服务器不能与以下服务器同名:其 SQL Server 分发服务器;使用分发服务器的任何 SQL Server 发布服务器;或接收发布的任何订阅服务器。 由同一分发服务器提供服务的每个发布都必须具有唯一的名称。
在 Oracle 发布中发布的表不能接收复制的数据。 因此,Oracle 发布不支持以下功能:包含立即更新订阅或排队更新订阅的发布;或者其中发布表还作为订阅表的拓扑,例如,对等和双向复制。
Oracle 数据库中主键与外键的关系不会复制到订阅服务器中。 但是,在传递更改时,会在数据中保持这种关系。
标准事务发布支持表的最大列数为 1000。 Oracle 事务发布支持 995 列(进行复制时,将向每个已发布表中添加 5 列)。
在 CREATE TABLE 语句中添加了 Collate 子句,以启用区分大小写的比较,这对主键和唯一约束非常重要。 此行为由架构选项0x1000控制,该选项是使用 sp_addarticle (Transact-SQL) @schema_option 参数指定的。
如果使用存储过程来配置或维护 Oracle 发布服务器,请不要将存储过程放到显式事务中。 用于连接 Oracle 发布服务器的链接服务器不支持这一操作。
如果使用向导创建 Oracle 发布的请求订阅,则必须使用 SQL Server 2005 及更高版本随附的“新建订阅向导”。 而对于 SQL Server的早期版本,可以使用存储过程和 SQL-DMO 接口来设置 Oracle 发布的请求订阅。
如果使用存储过程向订阅服务器传播更改(默认方式),请注意虽然支持 MCALL 语法,但当发布来自 Oracle 发布服务器时,该语法的行为会有所不同。 通常,MCALL 提供一个位图,用于显示在发布服务器中更新的列。 对于 Oracle 发布,位图始终显示已更新的所有列。 若要详细了解如何使用存储过程,请参阅指定如何传播事务项目的更改。
事务复制功能支持
对于 SQL Server 发布支持的架构选项,Oracle 发布并非都支持。 有关架构选项的详细信息,请参阅 sp_addarticle (Transact-SQL) 。
Oracle 发布的订阅服务器不能使用立即更新订阅或排队更新订阅,也不能作为对等或双向拓扑中的节点。
Oracle 发布的订阅服务器不能从备份中自动初始化。
SQL Server 支持两种验证:二进制验证和行计数验证。 Oracle 发布服务器支持行计数验证。 有关详细信息,请参阅验证已复制的数据。
SQL Server 提供了两种快照格式:本机 bcp 模式和字符模式。 Oracle 发布服务器支持字符模式快照。
不支持对已发布的 Oracle 表进行架构更改。 若要更改架构,请先删除发布,进行更改,然后重新创建发布和任何订阅。
注意
如果在已发布的表中没有发生任何活动时执行架构更改以及发布和订阅的后续删除与重新创建,则可以为订阅指定“仅支持复制”选项。 这样不用将快照复制到每个订阅服务器上就能使订阅同步。 有关详细信息,请参阅 初始化事务订阅(不使用快照)中手动初始化订阅。
复制安全模式
Oracle 发布的安全模式与标准事务复制的安全模式相同,但下列情况除外:
通过下列方法之一指定快照代理和日志读取器代理在分发服务器和发布服务器之间建立连接时使用的帐户:
sp_adddistpublisher (Transact-SQL) 的 @security_mode 参数, (还指定 @login 的值,如果使用 Oracle 身份验证 @password)
在 SQL Server Management Studio 的 “连接到服务器” 对话框中,在 SQL Server 分发服务器上配置 Oracle 发布服务器时就使用这种方法。
在标准事务复制中,使用 sp_addpublication_snapshot (Transact-SQL) 和 sp_addlogreader_agent (Transact-SQL) 指定帐户。
快照代理和日志读取器代理建立连接的帐户不能使用 sp_changedistpublisher (Transact-SQL) 或通过属性表更改,但可以更改密码。
如果为 sp_adddistpublisher (Transact-SQL ) 的 @security_mode 参数指定值 1 (Windows 集成身份验证) :
用于 快照代理 和日志读取器代理的进程帐户和密码 (sp_addpublication_snapshot (Transact-SQL) 和 sp_addlogreader_agent (Transact-SQL) ) 的@job_login和@job_password参数必须与用于连接到 Oracle 发布服务器的帐户和密码相同。
不能通过 sp_changepublication_snapshot (Transact-SQL) 或 sp_changelogreader_agent (Transact-SQL) 更改 @job_login 参数,但可以更改密码。
有关复制安全性的详细信息,请参阅SQL Server 复制安全性。