欢迎大家踊跃参与,以便大家共同进步。
解决方案 »
- win7 旗舰版 安装oracle 10g 出现ORA-12546: TNS: 权限被拒绝
- 根据列的值返回文本
- oracle10是否提供了Data Guard 组件?
- 怎样导入整个数据库
- 【请问】有没有谁装过 天盟Oracle9i,问题怪怪...
- 求一字符串处理的函数??
- 该怎么写sql来过滤这些呢???????????
- 一个人过情人节,郁闷,散分.
- Oracle表ABCD表内容并列显示 求解
- linux上oracle 监听启动报错TNS-12535 TNS-12560 TNS-00505
- 怎样写sql语句才能在oracle数据库中找出该数据库的表以及该表的总记录数
- 在Win2000下Oracle9i客户端无法连接Linux上的oracle manager server
透明网关,真的没有用过,值得关注
Oracle Gateways通过中间层应用实现对异种数据源的访问。使用Oracle Transparent Gateway,可以访问多种非Oracle 数据源,例如Sybase、Informix、DB2等。此外,使用Oracle Generic Connectivity,可以访问支持ODBC或OLLE-DB协议的非Oracle 数据源。 但是,oracle 8i支持内嵌的java程序,那么可以用jdbc,一样可以操作异种库。
Oracle 提供各种信息集成方案。这些解决方案可以分成两组:同步和异步。关于异步信息集成方案的详细信息,请参阅 Oracle Streams 页。对于同步信息集成,Oracle 提供两种解决方案,即普通连接和透明网关。Oracle 普通连接
Oracle 8.1.6 中引入普通连接,这一连接解决方案满足了对许多数据存储的数据访问(Oracle 对这一问题没有网关解决方案)需求。该特性允许使用业界标准 ODBC 和 OLEDB 建立透明连接。Oracle 透明网关
Oracle8i 透明网关为很多 Oracle 环境下透明访问非 Oracle 数据存储提供灵活性、power 和可伸缩性。这些非 Oracle 数据存储包括 Microsoft SQL Server、Informix、Ingres 和Sybase。
“向开发人员咨询”计划
技术信息
1 Oracle9i:Oracle Transparent Gateway for RMS 移植指南
从 RMS v4.1.1的透明网关到 RMS v9.0.1 的透明网关的移植指南。
http://otn.oracle.com/global/cn/products/gateways/htdocs/RMS_Migration_Guide.htm2 Oracle9i普通连接和透明网关
http://otn.oracle.com/global/cn/products/gateways/gateways_fov.html
3 Oracle9i:普通连接和透明网关
http://otn.oracle.com/global/cn/products/gateways/gateways_fov.html
4 关于普通连接和透明网关的常见问题
http://otn.oracle.com/global/cn/products/gateways/faq.html
5 消息网关
http://otn.oracle.com/products/aq/htdocs/msgwy_ds_html.html
下载
开放系统 Transparent Gateways v9 及更高版本都可从 Oracle 数据库 CD 中获得,并可从 OTN 选择 9i 数据库来下载。
配置TRANSPARENT GATEWAY FOR SYBASE步骤1.
安装TRANSPARENT GATEWAY FOR SYBASE选件,要用自定义安装。
正确选择sybase的安装目录2.
oracle所在服务器上安装sybase client(或者在同一台server上)
确保能够访问sybase数据库3.
选择一个sid字符串准备赋给sybase数据库。如:tg4sybs
这个SID用来唯一确定一个透明网关实例,其作用就好像是ORACLE的数据库实例SID。
设置SYBASE的dll路径到环境变量PATH,确保ORACLE SERVER可以访问SYBASE数据库的动态连接库。
如果不能访问这些DLL,可以拷贝到WINNT/SYSTEM目录下4.
修改初始化文件,默认的是:
ORACLE_HOME\tg4sybs\admin\inittg4sybs.ora
设置参数
HS_FDS_CONNECT_INFO
格式:HS_FDS_CONNECT_INFO= server_name. database_name[,INTERFACE= interface_file]
server_name. database_name是大小写敏感的。
INTERFACE可选例子:如下
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
# This is a sample agent init file that contains the HS parameters that are
# needed for the Transparent Gateway for Sybase#
# HS init parameters
#
HS_FDS_CONNECT_INFO=migration_serv.tax
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER#
# Environment variables required for Sybase
#
set SYBASE=d:\sybase
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
上例中
server_name是migration_serv
database_name是tax5.
配置oracle网络服务的listener,配置文件是:listener.ora
默认路径:ORACLE_HOME\network\admin
加入如下SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME= gateway_sid)
(ORACLE_HOME= oracle_home_directory)
(PROGRAM=tg4sybs)
)
)gateway_sid就是3选择的sid字符串
oracle_home_directory是ORACLE_HOME
tg4sybs若是SYBASE是特定的。如果是其他数据库,会不同。
例子如下:
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
(SID_DESC=
(SID_NAME=tg4sybs)
(ORACLE_HOME = D:\oracle\ora92)
(PROGRAM=tg4sybs)
)
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$6.
停止监听
重新启动监听程序7.
配置oracle server的tnsnames.ora使其能够访问sybase
connect_descriptor=
(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST= host_name)
(PORT= port_number)
)
(CONNECT_DATA=
(SID= gateway_sid))
(HS=OK))connect_descriptor是连接串,任取,一般为sybs
host_name:oracle server的name
port_number:oracle监听端口
gateway_sid就是3选择的sid字符串例子如下:
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
sybs=
(DESCRIPTION=
(ADDRESS_LIST =
(ADDRESS=(PROTOCOL=TCP)(HOST= dw-server1)(PORT= 1521))
)
(CONNECT_DATA=
(SID= tg4sybs)
)
(HS=OK)
)$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$8.建立database link如:
CREATE DATABASE LINK sybs CONNECT TO SA
IDENTIFIED BY PRIENT
USING 'SYBY' ;
即可访问sybase 数据库
SELECT * FROM MYTAB@SYBS;
请注意大小写问题。如果是小写的,请加"",如:
SELECT * FROM "mytab"@SYBS;
例子如下:
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
SQL> select area_code from tc_public_301@sybs;
select area_code from tc_public_301@sybs
*
ERROR 位于第 1 行:
ORA-00904: "AREA_CODE": 无效的标识符
SQL> select "area_code" from "tc_public_301"@sybs where rownum<10;area_c
------
020000
020101
020102
020103
020104
020105
020106
020107
020108已选择9行。
图2.1 tg4msql1 如何配置透明网关呢?打开inittg4msql.ora:## HS init parameters# xzh代表SQL服务名,pubs代表要访问的SQL数据库#HS_FDS_CONNECT_INFO="SERVER=xzh;DATABASE=pubs"HS_FDS_TRACE_LEVEL=OFFHS_FDS_RECOVERY_ACCOUNT=RECOVERHS_FDS_RECOVERY_PWD=RECOVER2 监听的配置oracle_home\network\admin\Listiner.oraLISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1521)) ) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1527)) ) ) )SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = xzh.world) (ORACLE_HOME = D:\oracle\ora92) (SID_NAME = xzh) ) (SID_DESC = (GLOBAL_DBNAME = tg4msql) (PROGRAM = tg4msql) (SID_NAME = tg4msql) (ORACLE_HOME = D:\oracle\ora92) ) ) 加亮代码是要在监听文件中新加部分,GLOBAL_DBNAME、SID_NAME可以任意,PROGRM必须指向tg4msql如图2.1所示。3 本地服务文件的配置oracle_home\network\admin\TnsNames.oraXZH = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = xzh.world) ) ) TG4MSQL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1527)) ) (CONNECT_DATA = (SID = tg4msql) ) (HS = OK) ) 使用SQL的本地服务名为TG4MSQL,可以任意写,SID必须是Listiner.ora中指定的那个SID_NAME,PORT也必须是监听中指定的PORT,主机等都要符合一致。 到此为止,我们把透明网关大致已经配置好啦,如果要访问SQL,还要使用数据库链才方便。4 在SQL中创建登录帐号xzh口令xzh,使用可以访问PUBS数据库。CREATE DATABASE LINK sql CONNECT TO xzh IDENTIFIED BY xzhUSING ‘TG4MSQL’这里的USING ‘TG4MSQL’是tnsnames.ora中配置好的本地服务名,sql是我们以后要引用的数据库链名。SQL>SELECT * FROM sales@sql如果有数据返回,表示我们访问SQL数据库的通道已经建成,请大胆使用吧,但对远程异构数据库不充许进行DDL操作。SQL>CREATE TABLE all_users@tg4msql FRIN all_users; *ERROR 位于第 1 行:ORA-02021: 不允许对远程数据库进行 DDL 操作 二 SQL访问ORACLE的方法1 通过行集函数OPENDATASOURCE OPENDATASOURCE ( provider_name, init_string ) SELECT *FROM OPENDATASOURCE( 'MSDAORA', 'Data Source=xzh.oracle;User ID=POS;Password=POS')..POS.A0325 MSDAORA是OLEDB FOR ORACLE的驱动,初始化字符串指定本地服务名、用户名、口令。然后引用表中数据时要以服务器..用户名.表名。注意一定是四部分组成,用户名与表名一定要大写。 SELECT * INTO PUBS.DBO.A0325 FROM OPENDATASOURCE( 'MSDAORA', 'Data Source=xzh.oracle;User ID=POS;Password=POS' )..POS.A0325 --将ORACLE中POS模式的A0325导入SQL的PUBS数据库。 2 通过SQL的链接服务器引用ORACLE的数据 --查看已经存在的链接服务器 SELECT*FROM SYSSERVERS --添加链接服务器到SQL EXEC SP_ADDLINKEDSERVER @server = 'ORCL', --ORCL是SQL中链接服务器名称 @srvproduct = 'Oracle', --Oracle 固定的 @provider = 'MSDAORA', --MSDAORA 固定的 @datasrc = 'xzh.oracle' --DataSrc 本地服务名 EXEC SP_DROPSERVER ‘ORCL’ --删除链接服务器 在这里声明一下,如果现在就访问ORACLE肯定不能,因为没有提供登录ORACLE的用户名/口令 EXEC SP_ADDLINKEDSRVLOGIN 'ORCL', false, 'sa', 'POS', 'POS'Sa是SQL本地登录帐号,POS/POS是ORACLE的登录帐号,但这句话对我们要达到的目的没有帮助。SELECT * FROM ORCL..POS.A0325还是四部分组成,注意事项同上,为什么不行呢,本人一直在寻找解决办法,最后发现通过SQL语句没法解决,只有打开SQL的企业管理器。
图2.2 配置ORACLE的远程帐号
图2.3设置远程登录帐号SELECT * FROM ORCL..POS.A0325 --这次终于OK。SELECT * FROM OPENQUERY(ORCL, 'SELECT * FROM POS.A0325')3 使用SQL的OPENROWSET函数SELECT a.*FROM OPENROWSET('MSDAORA', 'xzh.oracle';'POS';'POS', POS.A0325) AS a ORDER BY a.ID 有些地方要用别名才能引用,请大家注意。 4使用ODBC的方式SELECT A.*FROM OPENROWSET('MSDASQL','ORCL_ODBC';'POS';'POS', POS.A0325) AS AORDER BY A.ID ORCL_ODBC是ORACLE的ODBC数据源,创建ODBC不用我说吧,以上所有代码在SQL QUERY ANALYZE 中通过。 三 总结 关于SQL访问ORACLE有四种方式,其中通过ODBC与链接服务器的方式做起来难度较大,对手新手会麻烦一些,使用OLE DB FOR ORACL驱动时,有OPENDATASOURCE与OPENROWSET函数可以使用,都很方便,笔记喜欢使用后者,交待一下,在数据存取方面,这四种方面效率相当。
根据oracle的文档,可以利用generic conectivity,就不需要任何网关。
generic connectivity是通过odbc,oledb来连接异种库。
可是,照online book上的描述,更本不成功,而且提示信息一样让人摸不着头脑。
我配置了一个连接到sql server的hs service。
inithssql2k.ora
# This is a sample agent init file that contains the HS parameters that are
# needed for an ODBC Agent. #
# HS init parameters
#
#HS_FDS_CONNECT_INFO = <odbc data_source_name>
#HS_FDS_TRACE_LEVEL = <trace_level>
HS_FDS_CONNECT_INFO = SQL2K
HS_FDS_TRACE_LEVEL = ON
HS_AUTOREGISTER = TRUE#
# Environment variables required for the non-Oracle system
#
#set <envvar>=<value>listener.ora
..
(SID_DESC=
(SID_NAME=hssql2k)
(ORACLE_HOME=d:\oracle\ora81)
(PROGRAM=hsodbc)
)
...tnsnames.orasql2k =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
(CONNECT_DATA=(SID=hssql2k))
(HS=OK)
) SQL>create or replace public database link sql2k connect to pb identified by pb using 'sql2k';
Database link created.SQL> select * from dbo.sysobjects@sql2k;
select * from dbo.sysobjects@sql2k
*
ERROR at line 1:
ORA-02085: database link SQL2K connects to HO.WORLD真是奇怪。