从 Oracle 数据库进行发布旨在与 Microsoft SQL Server 数据库的发布过程几乎一样。 但是,应注意以下限制和问题:
Oracle 网关选项相比 Oracle 完整选项提供了更好的性能;然而,此选项不能用于在多个事务发布中发布同一表。 一个表最多可以出现在一个事务发布中,但可以出现在任意数量的快照发布中。 如果需要在多个事务发布中发布同一个表,请选择“Oracle Complete”选项。
复制支持发布表、索引和物化视图。 不会复制其他对象。
在 Oracle 和 SQL Server 数据库中存储和处理影响复制的数据之间存在一些细微差异。
使用 Oracle 发布服务器时,事务复制功能支持的方式存在许多差异。
支持从 Oracle 发布对象
复制支持从 Oracle 数据库复制以下对象:
表格
索引组织的表
索引
具体化视图(它们被复制为表格)
以下内容可以存在于已发布的表上,但不会复制:
基于域的索引
基于函数的索引
默认值
CHECK 约束
外键
存储选项(表空间、群集等)
无法复制以下对象:
嵌套数据表
浏览量
包、包体、过程和触发器
队列
序列
同义词
有关支持的数据类型的信息,请参阅 Oracle 发布服务器的数据类型映射。
Oracle 和 SQL Server 之间的差异
Oracle 对某些对象具有不同的最大大小限制。 在 Oracle 发布数据库中创建的任何对象都应遵守 SQL Server 中相应对象的最大大小限制。 有关 SQL Server 中的限制的信息,请参阅 SQL Server 的最大容量规范。
默认情况下,Oracle 对象名称以大写形式创建。 如果它们在 Oracle 数据库中是大写的,请确保在通过 SQL Server 发行者发布它们时,以大写形式提供 Oracle 对象的名称。 未能在正确的情况下指定对象可能会导致一条错误消息,指示找不到该对象。
Oracle 与 SQL Server 的 SQL 方言略有不同;行筛选器应采用符合 Oracle 的语法编写。
大型对象的注意事项
大型对象(LOB)数据未存储在项目日志表中;始终直接从已发布的表中检索 LOB 数据的更新。 仅当影响 LOB 的操作在复制表上触发复制触发器时,更新才会在事务发布中复制。 当插入或删除包含 LOB 的行时,Oracle 触发器将触发;但是,对 LOB 列的更新不会触发触发器。 仅当同一行的非 LOB 列也在同一 Oracle 事务内得到更新时,LOB 列的更新才会被立即复制。 否则,当同一行中的非 LOB 列的下一次更新发生时,将在订阅服务器上刷新 LOB 列。 确保应用程序可以接受此行为。
若要在事务性发布中复制 LOB 列的更新,在编写应用程序时,请考虑以下其中一种策略:
删除并重新插入事务中的行,而不是更新行:在重新插入行时指定新的 LOB。 由于删除并插入这两个触发触发器,因此将复制该行。
除了 LOB 列之外,在行更新中包含非 LOB 列,或更新行的非 LOB 列作为同一 Oracle 事务的一部分。 在这两种情况下,非 LOB 列的更新可确保触发器触发。
有关 BLOB 的详细信息,请参阅 Oracle 发布服务器的数据类型映射。
唯一索引和约束
对于快照复制和事务复制,唯一索引和约束中包含的列(包括主键约束)必须遵循某些限制。 如果它们不符合这些限制,则不会复制约束或索引。
SQL Server 索引中允许的最大列数为 16。
唯一约束中包含的所有列都必须具有支持的数据类型。 有关数据类型的详细信息,请参阅 Oracle 发布服务器的数据类型映射。
必须发布唯一约束中包含的所有列(不能对其进行筛选)。
唯一约束或索引中涉及的列不应为 null。
另请考虑以下问题:
Oracle 和 SQL Server 处理 NULL 的方式不同:在 Oracle 中,允许多行在允许 NULL 的列中具有 NULL 值,而这些列包含在唯一约束或索引中。 SQL Server 仅允许对同一列使用 NULL 值的单个行来强制实施唯一性。 如果已发布的表中的索引或约束所涉及的任何列包含多个 NULL 值,则不能发布允许此类情况的唯一约束或索引,因为这会在订阅服务器上导致约束冲突。
测试唯一性时,SQL Server 会忽略字段中的尾随空白,但不会被 Oracle 忽略。
与 SQL Server 事务复制一样,Oracle 事务发布的表需要主键;主键必须基于上面指定的规则是唯一的。 如果主键不遵循前面项目符号中概述的规则,则无法发布该表以进行事务性复制。
Oracle 发布与标准事务复制之间的差异
Oracle 发布服务器的名称不能与:其 SQL Server 分发服务器相同;任何使用分发服务器的 SQL Server 发布服务器;或接收发布的任何订阅服务器。 由同一分销商管理的出版物必须具有唯一的名称。
在 Oracle刊物中发布的表无法接收复制数据。 因此,Oracle 发布不支持:具有立即更新或排队更新订阅的发布;或发布表也充当订阅表的拓扑,例如对等复制和双向复制。
Oracle 数据库中主键到外键关系不会复制到订阅者。 但是,在传递更改时,数据中会维护关系。
标准事务性出版物支持最多 1000 列的表。 Oracle 事务发布支持 995 列(复制向每个已发布表添加 5 列)。
Collate 子句被添加到 CREATE TABLE 语句中,以便启用区分大小写的比较,这对于主键和唯一约束至关重要。 此行为由架构选项0x1000进行控制,该选项使用 sp_addarticle (Transact-SQL) 的 @schema_option 参数指定。
如果使用存储过程来配置或维护 Oracle 发布服务器,请不要将过程放入显式事务中。 不支持通过用于连接到 Oracle 发布服务器的链接服务器执行此作。
如果使用向导创建 Oracle 发布的拉取订阅,则必须使用 SQL Server 2005 和更高版本提供的新订阅向导。 在早期版本的 SQL Server 中,您可以使用存储过程和 SQL-DMO 接口来设置对 Oracle 发布的拉取订阅。
如果使用存储过程将更改传播到订阅服务器(默认值),请注意,MCALL 语法受支持,但在发布来自 Oracle 发布服务器时,它具有不同的行为。 通常 MCALL 提供一个位图,用于显示发布服务器上更新的列。 使用 Oracle 发布时,位图始终显示所有列都已更新。 有关使用存储过程的详细信息,请参阅 指定如何传播事务性文章的更改。
事务复制功能支持
Oracle 的发布不支持 SQL Server 发布所支持的所有架构选项。 有关架构选项的详细信息,请参阅sp_addarticle(Transact-SQL)。
Oracle 发布物的订阅者不能使用即时更新或排队更新订阅,也不能作为对等或双向拓扑中的节点。
无法从备份自动初始化 Oracle 出版物的订阅者。
SQL Server 支持两种类型的验证:二进制和行计数。 Oracle 发布程序支持行计数验证。 有关详细信息,请参阅 “验证复制的数据”。
SQL Server 提供两种快照格式:原生 bcp 模式和字符模式。 Oracle 发布者支持字符模式的快照。
不支持对已发布 Oracle 表的架构更改。 若要进行架构更改,请先删除发布、进行更改,然后重新创建发布和任何订阅。
注释
如果架构更改以及发布和订阅的后续删除和重新创建是在已发布表上未发生任何活动时执行的,则可以指定订阅的选项“仅复制支持”。 这样就可以同步它们,而无需将快照复制到每个订阅者。 有关详细信息,请参阅 在不使用快照的情况下初始化事务订阅。
复制安全模型
Oracle 发布的安全模型与标准事务复制的安全模型相同,但有以下例外:
快照代理和日志读取器代理从分发服务器连接到发布服务器的帐户是通过以下方法之一指定的:
sp_adddistpublisher(Transact-SQL)的@security_mode参数(如果使用 Oracle 身份验证,则还指定@login和@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 复制安全性。