ORACLE 创建DBlink访问SQL SERVER数据库

 

Oracle中使用透明网关链接到Sqlserver

在最近项目中需要从Oracle中访问SQL Server数据库, 自然想到了透明网关. 因为Oracle数据库是Linux上的, 而Linux上的Oracle9i不包括连接到SQL Server的透明网关.就在一台单独的Windows服务器上安装了透明网关用做Oracle访问SQL Server的桥梁.

环境如下:

Oracle Database Server:Linux + oracle 9.2.0.4 IP:10.194.129.197

Transparent Gateway:Windows 2003 server IP: 10.194.129.225

MS SQL Server:Windows 2003 server + SQL Server 2005 IP: 10.194.129.225

1、 Transparent Gateway for SQL Server安装

 从Oracle 9i数据库安装光盘setup.exe安装,选择安装客户端

安装类型选择:管理员

 安装完客户端后,重新运行setup.exe,安装产品选择Oracle 9i Database 9.2.0.1.0, 安装类型选择"自定义",安装组件选择Oracle Net Services和Oracle Transparent Gateways, 并在此项下选择Oracle Transparent Gateway for Microsoft SQL Server, 安装过程中可以不设置连接到SQL Server的信息.如下图所示:

以下的IP地址及数据库以实际环境为准

2、 编辑%ORACLE_HOME%\tg4msql\admin\init%ORACLE_SID%.ora, 该文件包含了TG for SQL Server的配置信息, 其中%ORACLE_SID%是给TG的"SID", 默认为tg4msql. 修改文件中的行


HS_FDS_CONNECT_INFO="SERVER=10.194.129.225;DATABASE=185life" 

 

其中SERVER后为SQL Server所在的服务器名称或ip地址,Database为连接到的数据库名称.

当然,如果在SQL Server服务器上,有两个sql server实例,则使用‘服务器名"实例名’的方式设置上面的SERVER值,如:HS_FDS_CONNECT_INFO="SERVER=ZZL\MSSQLSERVER;DATABASE=MSDB"

3、 编辑%ORACLE_HOME%"network"admin"listener.ora, 编辑对应listener的SID_LIST


SID_LIST_LISTENER=

   (SID_LIST=

      (SID_DESC=

         (SID_NAME=%ORACLE_SID%)        

         (ORACLE_HOME=oracle_home_directory)        

         (PROGRAM=tg4msql)

      )

   )

 

例如:

SID_LIST_LISTENER =

 (SID_LIST =

    (SID_DESC =

      (SID_NAME = tg4msql)

      (ORACLE_HOME = d:\oracle\ora92) #oracle的主目录

      (PROGRAM = tg4msql)

    )

 )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

其中%ORACLE_SID%必须为第二布中设置的SID, 默认值为tg4msql. 修改listener.ora文件后需重启listener使修改生效.如果没有listener.ora文件,请用Net Configuration Assistant或Net Manager新建一个LISTENER.

以上操作都是在Transparent Gateway所在机器上。

4、 在Oracle服务器上:编辑需要连接到透明网关的Oracle Server的$ORACLE_HOME\network\admin\tnsnames.ora, 例如:


TG4MSQL =

 (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.194.129.225)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = tg4msql)

    )

    (HS = OK)

 )

 

 

 

 

 

 

 

 

HOST指向Transparent Gateway所在的机器的IP,Service_name为第3步中的SID_NAME

使用tnsping测试服务名是否连通,命令:tnsping tg4msql。如果不通,请检查防火墙及网络配置。

5、 在Oracle数据库中建立连接, 指向TG for SQL Server.


CREATE DATABASE LINK tg4msql CONNECT TO "user" IDENTIFIED BY "password" USING 'tg4msql';

 

 

其中tg4msql是tnsnames中建立的连接字符串.

ms sql server的用户名和密码必须小写,而且要加双引号

否则会报如下错误:

                错误信息:

                      ORA-28500: connection from ORACLE to a non-Oracle system returned this messsage:

                      [Transparent gateway from MSSQL][Microsoft][ODBC SQL Server Driver][SQL Server]??

                      'sa'????? (SQL State:28000; SQL Code: 18456)

                      ORA-02063: preceding 2 lines from LINK_ZZL

                错误原因:

                      在CREATE    DATABASE LINK LINK_ZZL的连接字符串中,ms sql server的用户名和密码必须小写,而且要加双引号

 

6、确保CATHS.sql已被运行。

以SYS用户连接上去,查看有没有SYS.HS_FDS_CLASS,如果没有,运行$ORACLE_HOME/RDBMS"ADMIN"CATHS.SQL

 

6、 测试, 如运行select * from emp@tg4msql等.
访问dblink时说明:
              这是基于网关的方式,因此不能在断开网络的情况下本地的oracle连接本地的ms sql server
              否则会报如下错误:
              ORA-28545: error diagnosed by Net8 when connecting to an agent
              NCRO: Failed to make RSLV connection
              ORA-02063: preceding 2 lines from LINK_ZZL

 

7、BUG解决。

如果在第6步出现以下错误提示,则以SYS运行


exec dbms_hs.replace_base_caps(531, 531, 'First/Last function');

 

 

 

ERROR at line 1:

          ORA-28522: error initializing heterogeneous capabilities

           ORA-28522: error initializing heterogeneous capabilities

           ORA-28559: FDS_CLASS_NAME is <GTW>9.2.0.5.0_128, FDS_INST_NAME is <link>

           ORA-02063: preceding 3 lines from %s

           ORA-00604: error occurred at recursive SQL level 1

           ORA-24274: no row exists in the HS$_BASE_CAPS table for these parameters

           ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86

           ORA-06512: at "SYS.DBMS_HS_UTL", line 431

           ORA-06512: at "SYS.DBMS_HS_CHK", line 51

           ORA-06512: at "SYS.DBMS_HS_UTL", line 48

           ORA-06512: at "SYS.DBMS_HS", line 38

           ORA-06512: at line 1

时间: 2024-09-17 04:45:37

ORACLE 创建DBlink访问SQL SERVER数据库的相关文章

Delphi编程访问SQL Server数据库

delphi是一个优秀的可视化软件开发环境,并已广泛应用于数据库软件的开发.在DelphiC/S版环境中,结合其优化的数据库操作,以及Borland Database Engine(即:BDE,数据库引擎),对开发客户机/服务器系统下的网络数据库软件提供了更加快速有效的途径.在客户机/服务器系统中,服务器端我们采用Microsoft SQL Server6.0 for WindowsNT作为数据库服务器:另外,在客户端采用Delphi编写客户软件.在此,我们假定SQLServer设置完毕,并已经

VFP中用SPT访问SQL Server数据库

VFP因它简单易学,可快速建立应用软件而深受广大程序员喜爱,但其数据库系统不安全也令广大用户非常头痛.随着MS SQL Server数据库系统的推广应用,其强大的安全性能普遍受到好评.笔者在长期的编程实践中,发现利用VFP的SQL pass-through(SPT)技术结合MS SQL Server数据库系统,也能像VB.Delphi.PowerBuilder一样轻松开发出优秀的客户/服务器(C/S)应用软件.现通过编写一个简单的通信录例子和广大VFP爱好者共同探讨. 一.服务器端MS SQL

ado 链接sql server-c++利用ADO如何通过Internet网访问SQL Server数据库?

问题描述 c++利用ADO如何通过Internet网访问SQL Server数据库? c++利用ADO如何通过Internet网访问SQL Server数据库?需要对电脑设置哪些关键的项. 我的代码:bstr_t strConnect = "Driver={SQL Server};Server=10.0.0.44;Database=test;UID=sa;PWD=111111" //_bstr_t strConnect = "Provider=SQLOLEDB.1;Passw

go语言通过odbc访问Sql Server数据库的方法_Golang

本文实例讲述了go语言通过odbc访问Sql Server数据库的方法.分享给大家供大家参考.具体如下: 这里需要用到go-odbc库,开源地址为:https://github.com/weigj/go-odbc 复制代码 代码如下: package main; import (     "fmt"     "database/sql"     _"odbc/driver" ) func main(){     conn,err := sql.O

Ruby中访问SQL Server数据库的配置实例_ruby专题

因为工作需要,要分析存放在SQL Server上的数据,所以不得不研究一下如何使用Ruby访问SQL Server,发现其实还是很简单的: 安装FreeTDS 下载FreeTDS源代码 解压编译安装: 复制代码 代码如下: ./configure --prefix=/usr/local/freetds && make && sudo make install 安装Tiny_TDS Tiny_TDS,安装和使用非常简单,推荐使用: 复制代码 代码如下: sudo gem in

Powershell访问SQL Server数据库代码实例_PowerShell

支持所有版本的SQLserver. 你是否需要连接数据库?这里有一段代码演示如何查询和获取SQL数据,只需非常简单正确的配置你的账户信息.服务器地址及SQL语句就行: 复制代码 代码如下: $Database                       = 'Name_Of_SQLDatabase' $Server                         = '192.168.100.200' $UserName                         = 'DatabaseUs

sql server-如何在SQL Server 数据库中调用JAVA程序

问题描述 如何在SQL Server 数据库中调用JAVA程序 工作中 遇到一个实际的问题如下: 一个在线的SQL server数据库A,他的一个触发器在数据库有更新时把新的数据插入的到另一个SQL server 数据库B,已经写好的一个JAVA程序可以把B中的数据全部复制到一个Oracle 数据库C中,并且立即把数据库B中的数据清空.现在希望这个程序能够自动执行,就是JAVA程序能够在检测到B中有新数据后立即开始自动执行.我已经知道对于Oracle数据库可以通过触发器直接调用JAVA程序,可是

使用 HTTP 访问 SQL Server

server|访问 使用 HTTP 访问 SQL Server可以使用 HTTP 访问 Microsoft SQL Server 2000.在可以使用 HTTP 指定查询前,必须先用用于 SQL Server 的 IIS 虚拟目录管理实用工具创建一个虚拟根. SQL Server 的 HTTP 访问能力使您得以: 直接在 URL 中指定 SQL 查询,例如: http://IISServer/nwind?sql=SELECT+*+FROM+Customers+FOR+XML+AUTO&root=

Windows 集成的身份验证连接SQL Server数据库,打造更安全的连接

server|window|安全|数据|数据库 摘要:今天用C#编写一个Windows 服务程序,其中要连接一个Windows 2003 Server上的SQL Server 2000 数据库,用SQL Server 身份验证.发现普通程序都能联上,但是Windows服务程序就是联不上. 后来查了资料,找到了解决方法.共享给大家. 三步解决: 1.  在服务器上创建一个用户,配置好SQL Server数据库访问权限. 2.  在客户端创建一个一样的用户. 3.  服务程序以刚创建的那个客户端用户