Sql server 将Oracle与SQL Server链接

Sql server 将Oracle与SQL Server链接,sql-server,oracle,ora-12154,Sql Server,Oracle,Ora 12154,我正在尝试将SQLServer2005链接到Oracle 10g数据库。我已经在SQL server上安装了Oracle客户端,并验证了我可以使用tnsping和sqlplus连接到Oracle数据库。当我尝试在SQL Server中运行查询时,会得到以下结果: 链接服务器“ORA_CSSA2APD”的OLE DB提供程序“OraOLEDB.Oracle”返回消息“ORA-12154:TNS:无法解析指定的连接标识符”。 味精7303,第16级,状态1,第1行 无法为链接服务器“ORA_CSSA

我正在尝试将SQLServer2005链接到Oracle 10g数据库。我已经在SQL server上安装了Oracle客户端,并验证了我可以使用tnsping和sqlplus连接到Oracle数据库。当我尝试在SQL Server中运行查询时,会得到以下结果:

链接服务器“ORA_CSSA2APD”的OLE DB提供程序“OraOLEDB.Oracle”返回消息“ORA-12154:TNS:无法解析指定的连接标识符”。
味精7303,第16级,状态1,第1行
无法为链接服务器“ORA_CSSA2APD”初始化OLE DB提供程序“OraOLEDB.Oracle”的数据源对象。

有什么想法吗?我尝试了以下两种查询,但都没有成功:

select*from openquery(ORA_CSSA2APD,'select count(rowid)from eservice_op.agent')


select count(rowid)from ORA_CSSA2APD..eservice_op.agent

TNS错误消息通常表示连接有缺陷(例如主机无法访问/指定端口超时,或者根本不知道ORA_CSSA2APD应该指向什么)

一个要考虑的问题是,你使用的是64位Windows,你使用的是32位还是64位Oracle客户端(或者两者兼有)。如果您在64位操作系统上运行一个32位应用程序试图调用Oracle,那么它需要一个32位Oracle客户端。在64位操作系统上使用32位客户端可能很棘手,不将其安装在“Program Files(x86)”文件夹中更安全

还要记住

在64位版本的Windows Server中 2003或Windows XP的 %WinDir%\System32文件夹已保留 适用于64位应用程序。当一个32位 应用程序尝试访问 System32文件夹,访问被重定向 转到以下文件夹: %WinDir%\SysWOW64


因此,对于64位windows,32位的内容在SysWOW64文件夹中,64位的内容在system32文件夹中

ORA:12154通常意味着在tnsnames.ORA文件中找不到您试图连接的数据库的别名。(请参阅更详细的说明。)

您需要确保数据源是tnsnames文件知道的别名(在SQL server所在的服务器上,无论从何处运行查询);SQL Server将与任何其他Oracle客户端一样,需要知道在没有tnsnames.ora文件的情况下连接到何处,而不知道Oracle数据库的详细位置

如果您没有访问SQL Server服务器的权限(冗余部门有一个),则需要让服务器管理员为您进行设置

(链接服务器的数据源属性应为您尝试链接到的数据库的tnsnames.ora alias中的别名。)


嗯…

我怀疑是环境设置。也就是说,您的会话正在拾取TNSNAMES.ORA文件,但SQL Server底层的会话没有。我会检查甲骨文主页,可能还有TNS管理员正在设置并指向

您是否能够将数据库的easy connect语法用于SQL Server连接


IE将ORA_CSSA2APD替换为hostname:1521/service_name

我们发现SQL Server出于未知原因开始在默认Oracle位置查找TNSNAMES.ORA文件

我们能够将TNSNAMES.ORA文件放置在以下位置,并取得了成功:

适用于32位操作系统上的32位SQL Server或64位操作系统上的64位SQL Server

%ProgramFiles%\Oracle
%ProgramFiles%\Oracle\network\admin
%ProgramFiles% (x86)\Oracle
%ProgramFiles% (x86)\Oracle\network\admin
适用于64位操作系统上的32位SQL Server

%ProgramFiles%\Oracle
%ProgramFiles%\Oracle\network\admin
%ProgramFiles% (x86)\Oracle
%ProgramFiles% (x86)\Oracle\network\admin

我们也可以使用SQL*Plus进行连接,但SQL Server无法。需要注意的是,SQL*Plus没有使用相同的TNSNAMES.ORA文件。这就是一个人工作的原因

这个问题也发生在我身上,但只发生在某些Windows用户帐户上。为OraOLEDB.Oracle提供(SSMS>服务器对象>链接服务器>提供>OraOLEDB.Oracle)启用“允许inprocess”提供程序选项的组合,重新启动SQL Server Windows服务,最后直接调整TNSNAMES.ora文件的权限。

我可以使用SQLPlus进行连接,并且我可以成功地对服务器进行tnsping,因此TNSNAMES文件没有问题,我使用的服务名称与我在TNSNAMES中指定的服务名称相同,作为sp_addlinkedserver命令。还有其他想法吗?和SQLServer在同一台机器上运行的SQLPlus?是的,它与SQLServer在同一台机器上运行。在SQLNET.ORA文件中,是否有类似以下内容的条目:NAMES.DEFAULT\u DOMAIN=WORLD?如果是这样,它会希望您在tnsnames.ora文件中的别名以.WORLD结尾。例如,如果默认的_域是WORLD,而不是:ORCL=(DESCRIPTION=…等)。您需要这样:ORCL.WORLD=(DESCRIPTION=…)在我的sqlnet.ora文件中只有两行:sqlnet.AUTHENTICATION\u SERVICES=(NTS)name.DIRECTORY_PATH=(TNSNAMES)操作系统和Oracle客户端都是32位的。两者的环境变量都已设置且准确。我没有尝试过上面概述的连接语法,但我尝试过创建一个UDL并将其复制到连接字符串中,但没有成功。我将尝试上面的语法,并让您知道结果。我很感激。我重新启动了服务,因为我不确定是否有,因为我设置了TNS_ADMIN环境变量,现在一切正常。谢谢你的帮助!正如@bokoxev所说,如果一切正常,但不工作,请尝试从MSSQL管理工作室重新启动整个MSSQL服务器,这对我来说是有效的。