使用新建发布向导从 Oracle 数据库创建快照发布或事务发布。 在创建发布之前,必须在 Microsoft SQL Server 分发服务器上安装 Oracle 软件,并配置 Oracle 数据库。 有关详细信息,请参阅配置 Oracle 发布服务器。
首次从 Oracle 数据库创建发布时,必须在 SQL Server 分发服务器上标识 Oracle 发布服务器(对于自同一数据库的后续发布,不需要执行此操作)。 标识 Oracle 发布服务器的操作可以从新建发布向导或“分发服务器属性 - <分发服务器>”对话框完成,本主题介绍了“分发服务器属性 - <分发服务器>”对话框。
-
在 SQL Server Management Studio 中,连接到要将 Oracle 发布服务器用作分发服务器的 SQL Server 实例,然后展开服务器节点。
-
右键单击“复制”文件夹,然后单击“分发服务器属性”。
-
在“分发服务器属性 - <分发服务器>”对话框的“发布服务器”页上,单击“添加”,再单击“添加 Oracle 发布服务器”。
-
在“连接到服务器”对话框中,单击“选项”按钮。
-
在“登录”选项卡上:
- 输入 Oracle 数据库实例名称,或者选择“服务器实例”组合框中的“浏览更多”。
- 选择“Oracle 标准身份验证”(建议)或“Windows 身份验证”。
如果选择“Windows 身份验证”: 必须将 Oracle 服务器配置为允许使用 Windows 凭据连接(有关详细信息,请参阅 Oracle 文档);当前必须以为复制管理用户架构指定的同一 Microsoft Windows 帐户登录。 - 如果选择“Oracle 标准身份验证”,则在配置过程中,请输入在 Oracle 发布服务器上创建的复制管理用户架构的登录名和密码。
-
在“连接属性”选项卡上,选择“网关”或“完整”发布服务器类型。
“完整”选项用于提供带有所有受支持功能的快照发布和事务发布,以进行 Oracle 发布。 “网关”选项提供特定的设计优化,以提高复制在作为系统之间的网关时的性能。 如果计划在多个事务发布中发布同一个表,则“网关”选项不可用。 如果选择“网关”选项,则一个表最多只能显示在一个事务发布中,但可以显示在任意数目的快照发布中。
-
单击“连接”,创建到 Oracle 发布服务器的连接,并配置该连接以进行复制。 关闭“连接到服务器”对话框,并返回到“分发服务器属性 - <分发服务器>”对话框。
注意: 如果网络配置出现问题,则在此将收到一条错误。 如果连接 Oracle 数据库时遇到问题,请参阅对 Oracle 发布服务器进行故障排除中的“SQL Server 分发服务器无法连接到 Oracle 数据库实例”部分。 -
单击“确定”。
-
连接到要将 Oracle 发布服务器用作分发服务器的 SQL Server 实例,然后展开服务器节点。
-
展开“复制”文件夹。
-
右键单击“本地发布”文件夹,然后单击“新建 Oracle 发布”。
-
在新建发布向导的“Oracle 发布服务器”页上,选择 Oracle 发布服务器。 如果未显示 Oracle 发布服务器,请单击“添加 Oracle 发布服务器”,逐步执行上一过程中的步骤。
-
在“发布类型”页上,选择“快照发布”或“事务发布”。
-
在“项目”页上,选择要发布的数据库对象。
也可以通过展开表并清除一个或多个列的复选框,来筛选掉表列。 单击“项目属性”可以查看和修改项目属性,还可以根据需要指定备用数据类型映射。 有关数据类型映射的详细信息,请参阅如何指定 Oracle 发布服务器的数据类型映射 (SQL Server Management Studio)。
-
也可以在“筛选表行”页上,应用筛选器发布一个或多个表的数据子集。
-
仅在创建所有对象并将所有所需数据添加到订阅数据库后,才能清除“快照代理”页上的“立即创建快照”。
-
在“代理安全性”页上,指定快照代理(适用于所有发布)和日志读取器代理(适用于事务发布)的凭据。 代理将使用指定的 Microsoft Windows 帐户上下文运行并连接到 SQL Server 分发服务器。 代理使用指定为复制管理用户架构的帐户上下文建立到 Oracle 数据库的连接。 有关详细信息,请参阅配置 Oracle 发布服务器。
-
在“向导操作”页上,根据需要,可以选择为发布编写脚本。 有关详细信息,请参阅编写复制脚本。
-
在“完成该向导”页上,指定发布的名称。
在 Oracle 数据库配置为发布服务器后,可以使用系统存储过程创建事务发布或快照发布,创建方法与从 Microsoft SQL Server 发布服务器创建发布相同。
-
将 Oracle 数据库配置为发布服务器。 有关详细信息,请参阅配置 Oracle 发布服务器。
-
如果不存在远程分发服务器,请配置远程分发服务器。 有关详细信息,请参阅如何配置发布和分发(复制 Transact-SQL 编程)。
-
在该 Oracle 发布服务器将使用的远程分发服务器上,执行 sp_adddistpublisher (Transact-SQL)。 将 @publisher 指定为该 Oracle 数据库实例的透明网络底层 (TNS) 名称,并将 @publisher_type 的值指定为 ORACLE 或 ORACLE GATEWAY。
- 若要使用 Oracle 标准身份验证(默认值),请将 @security_mode 的值指定为 0,并将 @login 和 @password 分别指定为 Oracle 发布服务器上创建的复制管理用户架构在配置过程中所设定的登录名和密码。
安全说明: 如果可能,请在运行时提示用户输入安全凭据。 如果将凭据存储在脚本文件中,则必须确保文件的安全以防未经授权的访问。 - 若要使用 Windows 身份验证,请将 @security_mode 的值指定为 1。
注意: 若要使用 Windows 身份验证,Oracle 服务器必须配置为允许使用 Windows 凭据的连接(有关更多信息,请参见 Oracle 文档);而且,您当前必须使用为复制管理用户架构指定的同一 Microsoft Windows 帐户登录到计算机。
- 若要使用 Oracle 标准身份验证(默认值),请将 @security_mode 的值指定为 0,并将 @login 和 @password 分别指定为 Oracle 发布服务器上创建的复制管理用户架构在配置过程中所设定的登录名和密码。
-
为发布数据库创建日志读取器代理作业。
- 如果不确定是否存在针对某个已发布数据库的日志读取器代理作业,请在该 Oracle 发布服务器使用的分发服务器的分发数据库中执行 sp_helplogreader_agent (Transact-SQL)。 将 @publisher 指定为该 Oracle 发布服务器的名称。 如果结果集为空,则必须创建一个日志读取器代理作业。
- 如果已经存在针对该发布数据库的日志读取器代理作业,请继续执行步骤 5。
- 在该 Oracle 发布服务器使用的分发服务器的分发数据库中,执行 sp_addlogreader_agent (Transact-SQL)。 为 @job_login 和 @job_password 指定运行该代理所用的 Windows 凭据。
注意: @job_login 参数必须与在步骤 3 中提供的登录名相符。不要提供发布服务器安全信息。 日志读取器代理使用步骤 3 中提供的安全信息连接到发布服务器。
-
在分发服务器上的分发数据库中,执行 sp_addpublication (Transact-SQL) 以创建发布。 有关详细信息,请参阅如何创建发布(复制 Transact-SQL 编程)。
-
在分发服务器上的分发数据库中,执行 sp_addpublication_snapshot (Transact-SQL)。 将 @publication 指定为在步骤 4 中使用的发布名称,并为 @job_name 和 @password 指定运行快照代理所用的 Windows 凭据。 若要在连接到发布服务器时使用 Oracle 标准身份验证,还必须将 @publisher_security_mode 指定为 0 值,并为 @publisher_login 和 @publisher_password 指定 Oracle 登录信息。 此操作将为发布创建一个快照代理作业。
虽然已经为 Oracle 发布服务器提供了一组默认数据类型映射,但可能仍有必要为给定的发布指定不同的映射。 可以使用复制存储过程,以编程方式指定自定义数据类型映射。 还可以设置在 Microsoft SQL Server 与非 SQL Server 数据库管理系统 (DBMS) 间映射数据类型时使用的默认映射。 有关详细信息,请参阅Oracle 发布服务器的数据类型映射。
-
如果尚不存在 Oracle 发布,请创建一个。 有关详细信息,请参阅如何从 Oracle 数据库创建发布(复制 Transact-SQL 编程)。
-
在分发服务器上,执行 sp_addarticle。 将 @use_default_datatypes 的值指定为 0。 有关详细信息,请参阅如何定义项目(复制 Transact-SQL 编程)。
-
在分发服务器上,执行 sp_helparticlecolumns 以查看已发布项目中某列的现有映射。
-
在分发服务器上,执行 sp_changearticlecolumndatatype。 为 @publisher 指定 Oracle 发布服务器的名称,并指定 @publication、@article 和 @column 以定义已发布的列。 为 @type 指定要映射到的 SQL Server 数据类型的名称,并在必要时指定 @length、@precision 和 @scale。
-
在分发服务器上,执行 sp_articleview。 这将创建用于从 Oracle 发布生成快照的视图。
-
(可选)在分发服务器上,对任意一个数据库执行 sp_getdefaultdatatypemapping。 指定 @source_dbms、@source_type、@destination_dbms、@destination_version 以及标识源 DBMS 所需的其他任何参数。 将使用输出参数返回有关目标 DBMS 中当前映射的数据类型的信息。
-
(可选)在分发服务器上,对任意一个数据库执行 sp_helpdatatypemap。 指定 @source_dbms 以及筛选结果集所需的其他任何参数。 记下结果集中所需映射的 mapping_id 的值。
-
在分发服务器上,对任意一个数据库执行 sp_setdefaultdatatypemapping。
- 如果知道在步骤 2 中获得的 mapping_id 的值,请对 @mapping_id 指定该值。
- 如果不知道 mapping_id,请指定 @source_dbms、@source_type、@destination_dbms、@destination_type 参数以及标识现有映射所需的其他任何参数。
-
在分发服务器上,对任何一个数据库执行 sp_helpdatatypemap。 将 @source_dbms 的值指定为 ORACLE,并指定筛选结果集所需的其他任何参数。
此示例将对其类型为 Oracle 数据类型 NUMBER 的列进行更改,以将该列映射到 SQL Server 数据类型 numeric(38,38) 而非默认数据类型 float。
EXEC sp_changearticlecolumndatatype @publication = 'OraPublication', @publisher = 'OraPublisher', @article = 'OraArticle', @column = 'OraArticleCol', @type = 'numeric', @scale = 38, @precision = 38; GO
此示例查询将返回 Oracle 9 数据类型 CHAR 的默认映射及替代映射。
EXEC sp_helpdatatypemap @source_dbms = N'ORACLE', @source_version = 9, @source_type = N'CHAR'; GO
此示例查询在未对 Oracle 9 数据类型 NUMBER 指定小数位数或精度时,返回该数据类型的默认映射。
Oracle 数据类型与 Microsoft SQL Server 数据类型不总是完全匹配。如果可能,在发布 Oracle 表时会自动选择匹配的数据类型。在单一数据类型映射不清晰的情况下,提供备用的数据类型映射。有关如何选择备用映射的信息,请参阅本主题后面的“指定备用数据类型映射”部分。
下表显示了将数据从 Oracle 发布服务器移动到 SQL Server 分发服务器时,在 Oracle 和 SQL Server 之间数据类型的默认映射情况。“备用”列指示备用映射是否可用。
Oracle 数据类型 | SQL Server 数据类型 | 备用 |
---|---|---|
BFILE | VARBINARY(MAX) | 是 |
BLOB | VARBINARY(MAX) | 是 |
CHAR([1-2000]) | CHAR([1-2000]) | 是 |
CLOB | VARCHAR(MAX) | 是 |
DATE | DATETIME | 是 |
FLOAT | FLOAT | 否 |
FLOAT([1-53]) | FLOAT([1-53]) | 否 |
FLOAT([54-126]) | FLOAT | 否 |
INT | NUMERIC(38) | 是 |
INTERVAL | DATETIME | 是 |
LONG | VARCHAR(MAX) | 是 |
LONG RAW | IMAGE | 是 |
NCHAR([1-1000]) | NCHAR([1-1000]) | 否 |
NCLOB | NVARCHAR(MAX) | 是 |
NUMBER | FLOAT | 是 |
NUMBER([1-38]) | NUMERIC([1-38]) | 否 |
NUMBER([0-38],[1-38]) | NUMERIC([0-38],[1-38]) | 是 |
NVARCHAR2([1-2000]) | NVARCHAR([1-2000]) | 否 |
RAW([1-2000]) | VARBINARY([1-2000]) | 否 |
REAL | FLOAT | 否 |
ROWID | CHAR(18) | 否 |
TIMESTAMP | DATETIME | 是 |
TIMESTAMP(0-7) | DATETIME | 是 |
TIMESTAMP(8-9) | DATETIME | 是 |
TIMESTAMP(0-7) WITH TIME ZONE | VARCHAR(37) | 是 |
TIMESTAMP(8-9) WITH TIME ZONE | VARCHAR(37) | 否 |
TIMESTAMP(0-7) WITH LOCAL TIME ZONE | VARCHAR(37) | 是 |
TIMESTAMP(8-9) WITH LOCAL TIME ZONE | VARCHAR(37) | 否 |
UROWID | CHAR(18) | 否 |
VARCHAR2([1-4000]) | VARCHAR([1-4000]) | 是 |
在从 Oracle 数据库复制数据时需注意下列数据类型问题。
不支持的数据类型
不支持以下数据类型,具有这些类型的列无法进行复制:
- 对象类型
- XML 类型
- Varray
- 嵌套表
- 使用 REF 的列
DATE 数据类型
SQL Server 中的日期范围为自公元 1753 年到公元 9999 年,而 Oracle 中的日期范围为自公元前 4712 年到公元 4712 年。如果类型为 DATE 的列包含超出 SQL Server 范围的值,则为该列选择备用数据类型 VARCHAR(19)。
FLOAT 和 NUMBER 类型
在 FLOAT 和 NUMBER 数据类型映射期间指定的小数位数和精度取决于为 Oracle 数据库中使用该数据类型的列指定的小数位数和精度。精度指数字的位数。小数位数指小数点后的数字位数。例如,数 123.45 的精度是 5,小数位数是 2。
Oracle 允许定义小数位数大于精度的数,如 NUMBER(4,5),但 SQL Server 要求精度等于或大于小数位数。为了确保不发生数据截断,如果在 Oracle 发布服务器上出现小数位数大于精度的情况,则会在映射数据类型时将精度设置为等于小数位数,例如 NUMBER(4,5) 将映射为 NUMERIC(5,5)。
注意: |
---|
如果未指定 NUMBER 的小数位数和精度,SQL Server 将默认使用最大的小数位数 (8) 和精度 (38)。建议您在 Oracle 中设置特定小数位数和精度,以在复制数据时能够改善存储和性能。
|
大型对象类型
Oracle 最多支持 4 GB,而 SQL Server 最多支持 2 GB。大于 2 GB 的复制数据会被截断。
如果 Oracle 表中包括一个 BFILE 列,则该列的数据将存储在文件系统中。必须使用以下语法授予复制管理用户帐户访问存储数据的目录的权限:
GRANT READ ON DIRECTORY <directory_name> TO <replication_administrative_user_schema>
有关大型对象类型的详细信息,请参阅 Oracle 发布服务器的设计注意事项和限制中的“大型对象注意事项”部分。
通常,默认数据类型映射便可满足需要,但对于许多 Oracle 数据类型,您可以从一组备用映射中选择数据类型映射来代替默认映射。指定备用映射的方式有两种:
- 使用存储过程或新建发布向导覆盖每个项目上的默认数据类型映射。
- 使用存储过程全局更改所有将来项目的默认数据类型映射(不更改现有项目的默认数据类型映射)。
指定备用数据类型映射
- SQL Server Management Studio: 如何指定 Oracle 发布服务器的数据类型映射 (SQL Server Management Studio)
- 复制编程:如何指定 Oracle 发布服务器的数据类型映射(复制 Transact-SQL 编程)