近期公司准备开发一个计费项目,数据库当然还是选用我最信赖的Oracle了。由于一部分基础数据在一台Win2000 Server的SQL Server 7.0数据库中,需要考虑灵活、可靠的方法实现从Oracle数据库端访问SQL Server中的数据。于是我有机会真正体验Oracle 9I 中的新增强功能“异构服务”(Heterogeneous Services)并为此痛苦了近两天。 先简单介绍一下Oracle异构服务。它是包含在Oracle数据库中的一个模块,通过使用透明网关(Transparent Gateway)或通用连接(Generic Connectivity)来访问其它非Oracle系统的数据。异构服务的主要结构如下:
各模块简要说明如下:
异构服务模块:属于Oracle数据库的内核部分,负责大部分异构连接的处理;
代理通用代码:对所有基于异构服务产品的通用代码;
驱动:是与非Oracle系统直接交互的模块,实现从异构服务API到特定非Oracle系统API的映射。
代理:是OracleServer连接非Oracle系统的进程,包括两部分即代理通用代码和针对特定非Oracle系统的驱动。代理的位置可以与非Oracle系统在同一台机器上,或与Oracle Server在同一台机器上,或者单独在一台机器上。我这次实践的环境采用的是最后一种。

我们所说的透明网关和通用连接实际是异构服务中代理的两种类型。其中透明网关是功能较强的,它通过代理进程从OracleServer访问各地的异构分布式数据库,而提供给用户的感觉是这些数据库仍然是Oracle数据库,Oracle公司提供对大多数商业数据库的透明网关。通用连接则有较多限制,它使用用户自己提供的ODBC或OLE DB驱动程序作为异构服务的代理驱动,并且要求这些驱动必须要安装在OracleServer的$ORACLE_HOME目录下。
好了,让我们开始亲自动手吧!我的实验环境如下:
主机
| 操作系统
| 软件环境
|
ORADB
| Redhat Linux 7.2
| Oracle 9.0.1 Database Standard Edition
|
GATEWAY
| Windows 2000 Professional
| Oracle 9.0.1 Database Standard Edition
SQL Server 2000 (安装类型“仅连接”)
|
SQLDB
| Windows 2000 Server
| SQL Server 7.0(访问的数据库是CDR)
|
注意:Transparent Gateway for Microsoft SQL Server目前只有NT版本,因此网关程序tg4msql仅包含在Oracle Database for windows中。
系统结构:
配置过程:
从SQLDB开始:
1. 在SQLDB上创建将要从Oracle数据库访问SQL Server的用户testuser/testuser,并授予可访问CDR的权限;
接下来是GATEWAY:
1.安装好Oracle 9.0.1 Database for Windows后,会发现在%ORACLE_HOME%下有目录tg4msql,以及网关程序$ORACLE_HOME\BIN\tg4msql;
2. 确保在c:\winnt\system32下有ntwdblib.dll,若没有则安装SQL Server2000(安装类型选择“仅连接”)。此文件是访问SQL Server的DB-Library;
3. ping SQLDB看是否通,若不通则在\winnt\system32\drivers\etc\hosts文件中增加一行,用来解析SQLDB的IP地址,很简单不多说了。
4. 修改%ORACLE_HOME%\tg4msql\inittg4msql.ora,这是网关进程启动时需要的初始化文件。只需改下面这一行即可:
HS_FDS_CONNECT_INFO=SQLDB.CDR
5.修改%ORACLE_HOME%\network\admin\listener.ora如下:
LISTENER =
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
)
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=tg4msql)
(ORACLE_HOME=e:\Oracle\OraHome_9I) #用你的%ORACLE_HOME%
(PROGRAM=tg4msql)
)
)
最后是ORADB:
1.修改tnsnames.ora
CDR = #CDR是我起的,你可以选用其它
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCP)
(HOST= GATEWAY)
(PORT = 1521)
)
(CONNECT_DATA =
(SID = tg4msql) #tg4msql必须要和GATEWAY上listener.ora中的SID一致
)
(HS = OK) #这很重要,告诉Oracle Server要调用异构服务模块来处理
)
2.修改initora9i.ora(数据库初始化文件)
global_names=true,重启数据库。
否则会在执行sql时报错:ORA-02085: 数据库链接CDR与HO.WORLD相连结
原因如下:The GLOBAL_NAMES parameter when set to TRUE implies that databaselink name should be similar to the Global database name to which youare trying to connect.
3.创建访问SQLDB.CDR的数据库链接
SQL>create public database link cdr connect to testuser identified by testuser using ‘CDR’;
4. OK!最后执行SQL测试看是否能正常访问SQL Server
SQL>select count(*) from all_tables@cdr;
看上去并不复杂,但这些内容是我在查阅若干文档和多次的失败后的精华所在呀!这其中获得的很多东西必须靠自己亲自实践才能牢记于心和融会贯通,所以你可不要仅仅满足于最后的结果,继续去啃Oracle的技术文档吧!祝开心、顺利!