如何在SQL 2000/2005上为Oracle数据库设置链接服务器?

时间:2008-11-21 02:24:52

标签: sql sql-server oracle

我能够创建并执行一个DTS包,将远程Oracle数据库中的表复制到本地SQL服务器,但是想要建立与Oracle数据库的连接作为链接服务器。

DTS包目前使用 Microsoft OLE DB Provider for Oracle ,具有以下属性:

  • 数据来源:SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.3.42)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=acc)));uid=*UserName*;pwd=*UserPassword*;
  • 密码: UserPassword
  • 用户ID:用户名
  • 允许保存密码:true

如何使用上面定义的数据源设置链接服务器到Oracle数据库?

2 个答案:

答案 0 :(得分:36)

我能够将链接服务器设置为远程Oracle数据库,最终成为一个多步骤过程:

  1. 在SQL Server上安装Oracle ODBC驱动程序。
  2. 在SQL Server上创建系统DSN到Oracle数据库。
  3. 使用系统DSN在SQL Server上创建链接服务器。
  4. 步骤1:在服务器上安装Oracle ODBC驱动程序

    一个。下载必要的Oracle Instant Client包:Basic,ODBC和SQL * Plus(可选)

    湾将软件包解压缩到SQL Server上的本地目录,通常为C:\Oracle。这应该会产生[{1}}之类的[目录],这将是本答案其余部分中引用的[目录]的值。

    ℃。在包含以下内容的即时客户端[目录]中创建名为 C:\Oracle\instantclient_10_2 的文本文件:

    tnsnames.ora

    注意:实际OracleTnsName = ( DESCRIPTION= ( ADDRESS = (PROTOCOL=TCP)(HOST=10.1.3.42)(PORT=1521) ) ( CONNECT_DATA = (SERVICE_NAME=acc) ) ) HOSTPORT会因您建立连接的Oracle服务器而异。通常可以使用侦听器下的Oracle网络客户端工具找到此信息。

    SERVICE_NAME可以是您要分配给Oracle数据源的任何名称,并将在设置系统DSN时使用。如果需要,您还可以使用上述语法在同一tnsnames.ora文件中定义多个TNS名称。

    d。将[directory]添加到系统 OracleTnsName 环境变量。

    即创建名为 PATH 的新系统环境变量,其值为[directory] ​​

    F。执行 TNS_Admin 实用程序以安装Oracle ODBC驱动程序。

    克。建议您重新启动SQL服务器,但可能没有必要。此外,您可能希望为此SQL Server服务器和SQL代理用户标识的目录授予安全权限。

    步骤2:创建使用Oracle ODBC驱动程序的系统DNS

    一个。打开 ODBC数据源管理器工具。 [管理工具 - >数据源(ODBC)]

    湾选择“系统DSN”选项卡,然后选择“添加”按钮。

    ℃。在驱动程序列表中,选择Instantclient {version} 中的 Oracle。 (例如,'即时客户端10_2中的Oracle')然后选择完成按钮。

    d。指定以下内容:

    • [directory]\odbc_install.exe:{System DSN Name}
    • Data Source Name:{leave blank / empty}
    • Description:应该在列出的 TNS Service Name 文件中定义OracleTnsName,将其选为值。
    • 用户ID :{Oracle用户名}

    即选择测试连接按钮。系统将提示您提供{Oracle用户密码}。如果一切顺利,测试将会成功。

    步骤3:在SQL中创建链接服务器到Oracle数据库

    在SQL Server中打开查询窗口并执行以下命令:

    tnsnames.ora

    注意:EXEC sp_addlinkedserver @server = '{Linked Server Name}' ,@srvproduct = '{System DSN Name}' ,@provider = 'MSDASQL' ,@datasrc = '{System DSN Name}' EXEC sp_addlinkedsrvlogin @rmtsrvname = '{Linked Server Name}' ,@useself = 'False' ,@locallogin = NULL ,@rmtuser = '{Oracle User Name}' ,@rmtpassword = '{Oracle User Password}' 可以是您在引用Oracle服务器时要使用的任何内容,但{Linked Server Name} 必须与您之前创建的系统DSN的名称相匹配。

    {System DNS Name}应与系统DSN使用的用户ID相同,{Oracle User Name}应与用于成功测试ODBC连接的用户ID相同。有关解决Oracle链接服务器问题的信息,请参阅KB 280106

    查询Oracle链接服务器

    您可以使用OPENQUERY在Oracle链接服务器上执行传递查询,但请注意,对于非常大的记录集,如果指定{{1},则可能会收到{Oracle User Password}错误消息传递查询中的子句。将ORA-01652子句从传递查询移动到外部select语句为我解决了这个问题。

答案 1 :(得分:1)

我遇到了同样的问题。我和微软通了几个小时的电话,他们没有解决方案。这些“连接超时”设置都没有帮助我。

为了解决这个问题,我创建了一个运行proc的DTS作业,该作业只在一行中每两分钟更新一行的时间。然后我在SQL Server和Oracle之间设置了一个复制,计划每3分钟从SQL复制到单个单元格的更改。它使连接保持活跃!