欢迎大家踊跃参与,以便大家共同进步。

解决方案 »

  1.   

    ORACLE Transparent GateWay,
    透明网关,真的没有用过,值得关注
      

  2.   

    随便说说
      Oracle Gateways通过中间层应用实现对异种数据源的访问。使用Oracle Transparent Gateway,可以访问多种非Oracle 数据源,例如Sybase、Informix、DB2等。此外,使用Oracle Generic Connectivity,可以访问支持ODBC或OLLE-DB协议的非Oracle 数据源。 但是,oracle 8i支持内嵌的java程序,那么可以用jdbc,一样可以操作异种库。
      

  3.   

    转载Oracle 普通连接和透明网关
     
    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 数据库来下载。 
      

  4.   

    ORACLE9i
    配置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行。
      

  5.   

    高级数据迁移       很多时间,要在异构数据库之间进行数据迁移或抽取,如果在SQL中提取ORACLE的数据,可以通过ODBC、OLEDB等多种方式,要从ORACLE提取SQL中的数据,大都是通过透明网关来实现的。       在异构数据抽取过程中,最好采用SQL92标准的语法编写SQL代码,同时要注意不同数据库之间数据类型的转换关系,如ORACLE的日期类型用DATE、SQL用Datetime等。 一 关于ORACLE的透明网关配置       ORACLE安装时(9i),将TRANSPARENT GATEWAY FOR MSSQL选中,在ORACLE主目录\BIN中,有个tg4msql.exe程序,它是透明网关程序啦,同时在主目录中还有tgrmsql的一个目录,ORACLE_HOME\tg4msql\admin目录中的inittg4msql.ora就是需要进行配置才能在ORACLE中连接SQL。
    图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函数可以使用,都很方便,笔记喜欢使用后者,交待一下,在数据存取方面,这四种方面效率相当。
      

  6.   

    oracle的database link好像配置比sql server的link server复杂多了。
    根据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真是奇怪。
      

  7.   

    问题解决,ORA-02085的问题在于,init<oracle_sid>.ora文件中,要设置global_name=false。
      

  8.   

    但是,Generic connectivity尽管不需要transparent gateway就能连接异种库,但是好像很不稳定,bug很多。如,我用sybase odbc,就老是说login failed.我连sql server 2000是好了,但是select name from sysobjects@sql2k, 会说“无效的列名”。看来,oracle 8i的generic connectivity比起sql server的link server,还是bug很多。
      

  9.   

    希望给位大侠,继续关注此贴,分不够再加。近期我还要开贴讨论关于Oracle的其他一些技术专题。
      

  10.   

    我现在正在试用ORACLE Transparent GateWay for SQL SERVER 性能还可可以,等成熟之后我会将使用中遇到的问题和解决方法和大家共享,收藏此贴继续关注。