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

Posted

技术标签:

【中文标题】如何在 SQL 2000/2005 上设置与 Oracle 数据库的链接服务器?【英文标题】:How do you setup a linked server to an Oracle database on SQL 2000/2005? 【发布时间】:2010-09-23 09:15:51 【问题描述】:

我能够创建并执行一个 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*; 密码:用户密码 用户 ID:用户名 允许保存密码:true

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

【问题讨论】:

【参考方案1】:

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

    在 SQL Server 上安装 Oracle ODBC 驱动程序。 为 SQL Server 上的 Oracle 数据库创建系统 DSN。 使用系统 DSN 在 SQL Server 上创建链接服务器。

第 1 步:在服务器上安装 Oracle ODBC 驱动程序

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

b.将包解压缩到 SQL 服务器上的本地目录,通常为 C:\Oracle。这应该会产生一个类似 C:\Oracle\instantclient_10_2 的 [directory],这将是本答案其余部分中引用的 [directory] ​​的值。

c。在包含以下内容的即时客户端 [目录] 中创建一个名为 tnsnames.ora 的文本文件:

OracleTnsName = 
(
  DESCRIPTION=
  (
    ADDRESS = (PROTOCOL=TCP)(HOST=10.1.3.42)(PORT=1521)
  )
  (
    CONNECT_DATA = (SERVICE_NAME=acc)
  )
)

注意:实际的 HOSTPORTSERVICE_NAME 会因您要建立连接的 Oracle 服务器而异。这些信息通常可以使用 listeners 下的 Oracle 网络客户端工具找到。

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

d。将[目录]添加到系统PATH环境变量中。

e。创建一个名为 TNS_Admin 的新系统环境变量,其值为 [directory]

f。执行 [directory]\odbc_install.exe 实用程序以安装 Oracle ODBC 驱动程序。

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

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

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

b.选择系统 DSN 选项卡,然后选择添加按钮。

c。在驱动程序列表中,选择 Oracle in instantclient version。 (例如 'Oracle in instantclient 10_2'),然后选择 Finish 按钮。

d。指定以下内容:

Data Source Name: 系统 DSN 名称 Description: 留空/空 TNS Service Name:应该列出您在tnsnames.ora文件中定义的OracleTnsName,选择它作为值。 用户 ID:Oracle 用户名

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

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

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

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'

注意:Linked Server Name 可以是您在引用 Oracle 服务器时要使用的任何名称,但 System DNS Name 必须与您之前创建的系统 DSN 的名称匹配。

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

查询 Oracle 链接服务器

您可以使用OPENQUERY 在 Oracle 链接服务器上执行传递查询,但请注意,对于非常大的记录集,如果您在 pass-通过查询。将ORDER BY 子句从传递查询移到外部选择语句为我解决了这个问题。

【讨论】:

您好,我发现 [srvproduct] 在调用 sp_addlinkedserver 时与 [datasrc] 具有相同的值。还想问一下,如果安装 Oracle 11g express 和 ODT 与 ODAC 11.1 将能够测试到 Oracle 的链接服务器。 该问题/答案发布于 Oracle 11g 之前的 2008 年。尝试设置新的链接服务器应该是一样的,但我不确定。 感谢您的完美回答。帮助我在几个小时内完成了我的 Oracle 链接服务器的全部设置和工作。补充一点,这似乎适用于 SQL 2012 和 Oracle 11g R2。 在瑞典,我必须再创建一个环境变量才能让我们的元音变音 (åäö) 正常工作:NLS_LANG=SWEDISH_SWEDEN.WE8ISO8859P1【参考方案2】:

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

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

【讨论】:

以上是关于如何在 SQL 2000/2005 上设置与 Oracle 数据库的链接服务器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 2000/2005 中执行区分大小写的搜索和替换?

在 SQL Server 2000/2005 中更新表的工具

怎么在sql servler2000中建立一个序列,用sequence写的

如何在 SQL Server 中的 OR 条件中确定优先级

备份数据库的磁盘上结构版本为611.服务器支持版本539,无法还原或升级数据库

在SQL SERVER 2008中执行数据时有错误提示,急求大家帮忙!