您的位置:首页 > 数据库 > Oracle

在ORACLE里设置访问多个SQL Server数据库

2007-08-09 23:06 183 查看
在ORACLE里设置访问多个SQL Server数据库
ORACLE访问SQL SERVER数据库有一篇《Oracle 异构服务实践》讲得很清楚。

但里面没有讲如何设置访问多个SQL Server数据库, 我就补充一下。

假设我们要在ORACLE里同时能访问SQL Server里默认的pubs和Northwind两个数据库。

1、在安装了ORACLE9i Standard Edition或者ORACLE9i Enterprise Edition的windows机器上(IP:192.168.0.2),
产品要选了透明网关(Oracle Transparent Gateway)里要访问Microsoft SQL Server数据库.

$ORACLE9I_HOME/tg4msql/admin下新写initpubs.ora和initnorthwind.ora配置文件
initpubs.ora内容如下:
HS_FDS_CONNECT_INFO="SERVER=sqlserver_hostname;DATABASE=pubs"
HS_DB_NAME=pubs
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER

initnorthwind.ora内容如下:
HS_FDS_CONNECT_INFO="SERVER=sqlserver_hostname;DATABASE=Northwind"
HS_DB_NAME=Northwind
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER

(蓝色字的部分可以根据具体要访问的SQL Server数据库的情况而修改)

$ORACLE9I_HOME/network/admin 下listener.ora内容如下:

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))
)
)
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = test9)
(ORACLE_HOME = d:/oracle/ora92)
(SID_NAME = test9)
)
(SID_DESC=
(SID_NAME=pubs)
(ORACLE_HOME=d:/Oracle/Ora92)
(PROGRAM=tg4msql)
)
(SID_DESC=
(SID_NAME=northwind)
(ORACLE_HOME=d:/Oracle/Ora92)
(PROGRAM=tg4msql)
)
)

重启动这台做gateway的windows机器上(IP:192.168.0.2)TNSListener服务.

(凡是按此步骤新增可访问的SQL Server数据库时,TNSListener服务都要重启动)

2、ORACLE8I,ORACLE9I的服务器端配置tnsnames.ora, 添加下面的内容:

pubs =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))
)
(CONNECT_DATA =
(SID = pubs)
)
(HS = pubs)
)

northwind =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))
)
(CONNECT_DATA =
(SID = northwind)
)
(HS = northwind)
)

保存tnsnames.ora后,在命令行下

tnsping pubs
tnsping northwind

出现类似提示,即为成功
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)
(PORT = 1521))) (CONNECT_DATA = (SID = pubs)) (HS = pubs))
OK(20毫秒)

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)
(PORT = 1521))) (CONNECT_DATA = (SID = northwind)) (HS = northwind))
OK(20毫秒)

设置数据库参数global_names=false。

设置global_names=false不要求建立的数据库链接和目的数据库的全局名称一致。
global_names=true则要求, 多少有些不方便。

oracle9i和oracle8i都可以在DBA用户下用SQL命令改变global_names参数

alter system set global_names=false;

建立公有的数据库链接:

create public database link pubs connect to testuser identified by testuser_pwd using 'pubs';

create public database link northwind connect to testuser identified by testuser_pwd using 'northwind';

(假设SQL Server下pubs和northwind已有足够权限的用户登录testuser,密码为testuser_pwd)

访问SQL Server下数据库里的数据:

select * from stores@pubs;
...... ......

select * from region@northwind;
...... ......

3、使用时的注意事项

ORACLE通过访问SQL Server的数据库链接时,用select * 的时候字段名是用双引号引起来的。

例如:
create table stores as select * from stores@pubs;

select zip from stores;

ERROR 位于第 1 行:
ORA-00904: 无效列名

select "zip" from stores;

zip
-----
98056
92789
96745
98014
90019
89076

已选择6行。

用SQL Navigator或Toad看从SQL Server转移到ORACLE里的表的建表语句为:

CREATE TABLE stores
("stor_id" CHAR(4) NOT NULL,
"stor_name" VARCHAR2(40),
"stor_address" VARCHAR2(40),
"city" VARCHAR2(20),
"state" CHAR(2),
"zip" CHAR(5))
PCTFREE 10
PCTUSED 40
INITRANS 1
MAXTRANS 255
TABLESPACE users
STORAGE (
INITIAL 131072
NEXT 131072
PCTINCREASE 0
MINEXTENTS 1
MAXEXTENTS 2147483645
)
/

总结: WINDOWS下ORACLE9i网关服务器在$ORACLE9I_HOME/tg4msql/admin目录下的initsqlserver_databaseid.ora

WINDOWS下ORACLE9i网关服务器listener.ora里面
(SID_DESC=
(SID_NAME=sqlserver_databaseid)
(ORACLE_HOME=d:/Oracle/Ora92)
(PROGRAM=tg4msql)
)

UNIX或WINDOWS下ORACLE8I,ORACLE9I服务器tnsnames.ora里面
northwind =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))
)
(CONNECT_DATA =
(SID = sqlserver_databaseid)
)
(HS = sqlserver_databaseid)
)

sqlserver_databaseid一致才行.

3:21 | 添加评论 | 固定链接 | 引用通告 (0) | 写入日志
Oracle 异构服务实践
计算机世界网-Oracle 异构服务实践 .a1 {font-size:1px;} 近期公司准备开发一个计费项目,数据库当然还是选用我最信赖的Oracle了。由于一部分基础数据在一台Win2000 Server的SQL Server 7.0数据库中,需要考虑灵活、可靠的方法实现从Or acle数据库端访问SQL Server中的数据。于是我有机会真正体验Oracle 9I 中的新增强功能“异构服务”(Heterogeneous Services)并为此痛苦了近两天。

先简单介绍一下Oracle异构服务。它是包含在Oracle数据库中的一个模块,通过使用透明网关(Transparent Gateway)或通用连接(Generic Connectivity)来访问其它非Oracle系统的数据。异构服务的主要结构如下:

各模块简要说明如下:

异构服务模块:属于Oracle数据库的内核部分,负责大部分异构连接的处理;

代理通用代码:对所有基于异构服务产品的通用代码;

驱动:是与非Oracle系统直接交互的模块,实现从异构服务API到特定非Oracle系统API的映射。

代理:是Oracle Server连接非Oracle系统的进程,包括两部分即代理通用代码和针对特定非Oracle系统的驱动。代理的位置可以与非Oracle系统在同一台机器上,或与Oracle Server在同一台机器上,或者单独在一台机器上。我这次实践的环境采用的是最后一种。

我们所说的透明网关和通用连接实际是异构服务中代理的两种类型。其中透明网关是功能较强的,它通过代理进程从Oracle Server访问各地的异构分布式数据库,而提供给用户的感觉是这些数据库仍然是Oracle数据库,Oracle公司提供对大多数商业数据库的透明网关。通用连接则有较多限制,它使用用户自己提供的ODBC或OLE DB驱动程序作为异构服务的代理驱动,并且要求这些驱动必须要安装在Oracle Server的$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 database link name should be similar to the Global database name to which you are 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的技术文档吧!祝开心、顺利!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: