PostRank

2009/02/26

異質資料庫練習

摘自:網路

1、安装 Microsoft Data Access Components (MDAC)SDK ODBC driver

2、test whether CATHS has run.connect to the Oracle server

as schema "SYSTEM" and do "DESCRIBE SYS.HS_FDS_CLASS".

If it does not exist, connect as SYS (or internal) and run

the CATHS script. (ORACLE_HOMERDBMSADMINCATHS.SQL)

3、建立 SQL SERVER 数据源

TEST_SQLSERVER

4、配置tnsnames.ora. (ORACLE_HOMENETWORKADMIN)

TEST_SQLSERVER =

(DESCRIPTION=

(ADDRESS=

(PROTOCOL=tcp)

(HOST=)

(PORT=1521)

)

(CONNECT_DATA=

(SID=TEST_SQLSERVER)

)

(HS=)

)

5、配置listener.ora. (ORACLE_HOMENETWORKADMIN)

(SID_DESC=

(SID_NAME=TEST_SQLSERVER)

(ORACLE_HOME=D:OracleiSuites)

(PROGRAM=hsodbc)

)

6、重启ORACLE监听.

CMD

LSNRCTL STOP

LSNRCTL START

LSNRCTL STATUS

7、添加网关配置文件. (ORACLE_HOMEHSADMIN)

文件名为:initTEST_SQLSERVER.ora

文件内容:

#

# HS init parameters

#

HS_FDS_CONNECT_INFO = TEST_SQLSERVER

HS_FDS_TRACE_LEVEL = 0

#HS_FDS_TRACE_FILE_NAME = TEST_SQLSERVER.trc

#

# Environment variables required for the non-Oracle system

#

#set =

8、进入ORACLE SQL*PLUS,建立数据库链.

CREATE DATABASE LINK TOSQL USING 'TEST_SQLSERVER';

ORACLE异类服务


象SQL SERVER的LINKED SERVER一样,ORACLE也能访问非ORACLE数据库,这是通过ORACLE异类服务(HS)实现的。从ORACLE开始引入并在 ORACLE8I版本中得到进一步扩充。ORACLE异类服务集成在ORACLE8I数据库服务器中,实现对非ORACLE系统的访问。根据访问非 ORACLE数据库方式的不同,ORACLE提供了两种不同的服务:
1. ORACLE开放互联(Generic Connectivity):是一个轻量级的互联方案,通过ODBC或OLE DB实现对非ORACLE数据库的访问。
2. ORACLE透明网关(Transparent Gateway):提供更健壮的互联方式,包括分布查询和分布式事务支持。
对希望访问的每一个非ORACLE数据库系统,都要求有一个异类服务代理(Heterogeneous Services Agent),它在ORACLE服务器和远程数据库间进行通讯,他包含了访问数据库时需要的特定数据库信息。
在 与非ORACLE系统进行通讯时,ORACLE捕获和存储SQL命令,并针对每一个远程数据原的特征转换信息。无论何时向远程数据库发送一个请 求,ORACLE都要查询存储的信息(该信息存在于ORACLE中以HS开头的数据字典中,详细请参照ORACLE HELP <>),将该请求转换为远程服务器能够处理的格式。

一. ORACLE8I通用互联
ORACLE8I通用互联在ORACLE8I服务器版本8.1.6中提供,他使用ODBC或OLD DB实现开放互联并与远程数据源通信。ORACLE8I服务器中同时提供ODBC 和OLE DB异类代理,不需再使用其他网络产品。
同时通用互联工作方式和编写ODBC, OLE DB客户端程序相似。主要区别似ORACLE服务器要先发起连接操作然后在与远程数据源通信,因此应用程序不需做任何修改。这种远程数据访问的优点是:
1. 很容易实现,客户应用不需做任何改变
2. 使用标准接口(ODBC,OLE DB)进行信息访问
3. 异类服务提供ORACLE数据类型到标准接口的数据类型转换
4. 支持SQL语言和内置函数
缺点是:不能执行远程存储过程,也不支持分布应用,只支持单节点事务,对有些数据类型的支持存在一些问题,譬如,SQL SERVER中image数据类型。不过对于一个不需要网关的数据源进行查询,采用通用互联还是有优势的。
二.ORACLE8I透明网关
针 对通用互联存在的限制,ORACLE8I透明网关对访问的非ORACLE数据源提供了更多特性支持。目前HS代理支持DB2,SYBASE,SQL SERVER和INFORMIX.。值得注意的是,通用互联以集成到ORACLE8I数据库服务器中并成为其中的一部分,而每个透明网管都必须单独购买 (ORACLE9I中包含透明网管组件)。
透明网关提供的功能:
1. 分布式事务:他允许一个事务跨越ORACLE和非ORACLE系统,保证事务要么完全提交要么完全会滚。
2. 透明SQL访问:集成两种不同的数据源使他们看上去一样,实际上,开发者不必担心两个系统间的语法差异,因为网管代理会将所用的SQL命令转换为目标数据库能够接受的语法格式。
3. 数据字典转换:与透明SQL访问一样,网关代理也将任意数据字典查询转换为非透明SQL访问系统的数据字典。
4. 直接传送SQL:给予程序员直接访问远程系统的能力。他能使开发者直接利用数据库特有的功能,但是此功能需要开发者了解目标数据库的语法,因为网关代理不对他进行转化。
5. 访问存储过程:允许程序执行存储过程,就像他是PL/SQL远程过程一样。

下面介绍透明网关提供的服务:
事 务服务:连接到远程系统时,事务服务要完成两个任务。第一,首次进行访问时在两个系统间建立一个身份确认Session,Session结束时断开此连 接,第二,事务服务扮演各个分布式事务间协调器的角色,它使用两阶段提交协议维护全局一致。为了实现分布式事务处理,需要使用MS DTC(MICROSOFT 分布事务协调器)在多个数据库之间协调两阶段提交过程。
SQL服务:SQL服务映射并转换ORACLE请求为远程系 统对应的语句。它使用异类服务数据字典表中存储的信息决定如何转换SQL请求才能使非ORACLE系统能够理解,其中包括将ORACLE系统函数转换为对 应的目标数据库函数,将ORACLE数据类型映射为相应的目标数据库的数据类型,以及数据字典的转换等。
过程服务:将存储过程映射为等价的目标数据库的过程,另外也使用存储在异类服务数据字典中的信息将ORACLE功能映射为目标数据库的功能。
三.建立异类服务代理环境
无论是使用通用互联还是透明网关,建立代理的步骤都是相同的。包括
1. 安装异类服务数据字典
该步骤完成在ORACLE数据库中创建数据字典表、视图和包。创建这些数据库对象的脚本是%ORACLE_HOME%RDBMSADMINCATHS.SQL文件。需要记住的是,运行该脚本必须以SYS或INTERNAL用户登陆。
创建这些对象的目的是保存远程系统的信息,这些信息包括功能翻译,SQL翻译和数据字典翻译。将信息存储在数据字典使访问数度加快,不必每次都查询目标数据库,这些信息相对来说是静态的。下面是异类服务使用的几个数据字典视图:
视图名称 描 述
HS_FDS_CLASS 允许访问的远程系统的类型信息
HS_FDS_INST 允许访问的远程系统中一个特殊类的每个实例信息
HS_CLASS_INIT 每个类的初始化参数信息
HS_INST_INIT 每个实例的初始化参数信息
HS_BASE_DD 异类服务能够翻译的所有ORACLE数据字典信息
HS_CLASS_DD 每个类的数据字典翻译内容信息
HS_INST_DD 每个实例的数据字典翻译内容信息
HS_BASE_CAPS 异类服务支持的功能信息
HS_CLASS_CAPS 每个类支持的功能信息
HS_INST_CAPS 每个实例支持的功能信息
HS_EXTERNAL_OBJECTS 分布式外部过程需要的信息



除了这些表和视图外,ORACLE还提供了DBMS_HS包,他完成对类、实例、初始化参数和异类服务支持的功能进行维护。详细请参考ORACLE ONLINE HELP<Distributed Database Systems>>。
2. 配置异类服务代理
配置异类服务比较简单,我个人认为理解异类服务的概念、架构和其提供的服务相对比较重要,因为只有了解了异类服务,才能对配置有深刻的理解。

对于通用互联,必须告诉异类服务将如何连接到非ORACLE系统,是使用ODBC 还是OLE DB。ORACLE提供了两个示例参数文件(位于%ORACLE_HOME%NETWORK
ADMIN目录下)inithsodbc.ora和inithsoledb.ora.
1).将inithsoledb.ora 文件拷贝为initGCSQL2000文件,参数文件名必须按照initGSID.ora进行命名转换,GSID是tnsnames.ora和listener.ora文件指定的网关系统标识符名称。
2).编辑initGCSQL2000.ora文件并更新以下内容:
HS_FDS_CONNECT_INFO=”UDLFILE=%ORACLE_HOME%ORA81HSADMINGCSQL2000.UDL”
#HS_FDS_TRACE_LEVEL=16
#HS_FDS_TRACE_FILE_NAME=
3). 在%ORACLE_HOME%ORA81HSADMIN中建立GCSQL2000.UDL,最简单的方法是建立GCSQL2000.txt文本文件,将其 文件名改为GCSQL2000..UDL,然后右击该文件,设置其属性,在属性对话框中选择正确的驱动程序并设置数据库连接属性,测试成功后退出。
4).重新启动监听器。

对于不同的数据库ORACLE提供了不同的透明网关,如下表所列,在这些目录下ORACLE提供了一些默认的参数文件,只要做简单的修改即可完成配置,下面以SQL SERVER为例进行配置,对于其他数据库的配置大同小异,读者可自己动手试试。
数据库类型 对应的ORACLE目录
SQL SERVER %ORACLE_HOME%ORA8TG4MSQL
DB2 %ORACLE_HOME%ORA8TG4DRDA
SYBASE %ORACLE_HOME%ORA8TG4SYBS

1). 将inittg4msql.ora 文件拷贝为initTGSQL2000文件,参数文件名必须按照initGSID.ora进行命名转换,GSID是tnsnames.ora和listener.ora文件指定的网关系统标识符名称。
2). 编辑initTGSQL2000.ora文件并更新SQL条目HS_FDS_CONNECT_INFO,用 SERVER_NAME.DATABASE_NAME指定为你想要连接的SQLSERVER数据库,例如,为了连接YLQ服务器上的Products数据 库,指定HS_FDS_CONNECT_INFO = YLQ.products即可。需要说明的是,对每个希望通过透明服务器代理进行访问的数据库,都需要一个独立的参数文件来包含正确的连接信息。
SQLSERVER透明网关目前还不支持SQL SERVER2000,并且不能连接到有实例名的SQLSERVER数据库上。

3. 配置监听器和Net8服务名
为 了ORACLE数据库能够与SQL SERVER数据库进行通信,首先必须配置NET8服务名,使ORACLE服务器能够与监听器进程识别的代理进行交互,需要注意的是服务名必须与异类服务 参数文件中指定的网关系统标识符(GSID)一致,另外NET8服务名中还必须包括HS=OK子句,以确保该连接能使用异类服务,下面是使用OLE DB和透明网关进行互联的TNSNAMES.ORA文件的例子:
MSOLEDB=(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=YLQ)(PORT=1521))
(CONNECT_DATA=(SID=GCSQL2000))
(HS=OK)
)

TGMSQL=(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=YLQ)(PORT=1521))
(CONNECT_DATA=(SID=TGSQL2000))
(HS=OK)
)
接下来便是配置监听器,使他能以指定的系统标识符监听异类服务的连接请求,当监听器收到请求后,把它传送给PROGRAM条目指定的代理程序,以下是配置的例子:
LISTENER=(ADDRESS=(PROTOCOL=TCP)(HOST=YLQ)(PORT=1521))
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=GCSQL2000)
(ORACLE_HOME=C:ORACLEORA81)
(PROGRAM=HSOLESQL)
)
(SID_DESC=
(SID_NAME=TGSQL2000)
(ORACLE_HOME=C:ORACLEORA81)
(PROGRAM=TG4MSQL)
)
)
记住要使你的配置立即生效,必须重新启动监听器
4. 创建数据库连接(DATABASE LINK)
创建异类服务数据库连接和创建普通的数据库连接没有任何区别,这里我就不想赘述了,详细请参考<>
5. 测试数据库连接
查询数据
SELECT * FROM “dbo”.”SYS_DB_INFO”@MSOLEDB;
创建同义词
CREATE SYNONYM L_SYS_DB_INFO FOR “dbo”.”SYS_DB_INFO”@MSOLEDB;
执行存储过程
exec check_money@TGSQLSERVER(par1,par2)
利用DBMS_HS_PASSTHROUGH包直接发送SQL.

沒有留言: