我能够创建并执行一个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*;
如何使用上面定义的数据源设置链接服务器到Oracle数据库?
答案 0 :(得分:36)
我能够将链接服务器设置为远程Oracle数据库,最终成为一个多步骤过程:
步骤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)
)
)
,HOST
和PORT
会因您建立连接的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
,将其选为值。即选择测试连接按钮。系统将提示您提供{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复制到单个单元格的更改。它使连接保持活跃!