如何解决使用 Instant Client 连接到 SQL Server 中的链接服务器 (Oracle)
我需要使用 MS sql Server (2019) 链接服务器连接到远程数据库 (Oracle)。到目前为止我做了什么:
- 在运行 sql 服务器的机器上安装了 Oracle Instant Client x64 和 ODBC 驱动程序
- 在 Oracle Instant 客户端文件夹内创建了一个指向中央 TNSNAMES.ORA(在网络中的文件共享上)的符号链接。
- 设置必要的环境变量
- 在这台机器上的 Oracle 服务器上创建了一个到数据库的 ODBC 连接
- 重新启动 MS sql Server
- 在 sql 实例中创建链接服务器(Microsoft OLEDB Provider for ODBC Drivers)
在这台机器上使用 sqlcmd 连接到 sql Server 时(我没有在那里安装 SSMS),我可以使用 OPENQUERY() 查询链接的数据库。我也可以使用这个命令读取文件 TNSNAMES.ORA(注意,给定的文件是符号链接,但它显示链接文件的内容,因为它应该):
SELECT * FROM OPENROWSET(BULK 'C:\InstantClientx64\tnsnames.ora',SINGLE_CLOB) TNSNames
到目前为止,一切都很好。
现在,当我使用 SSMS 从我的工作站连接到 sql Server 时,尝试使用上述命令读取 TNSNAMES.ORA 时出现以下错误:
Cannot bulk load because the file "C:\InstantClientx64\tnsnames.ora" Could not be opened. Operating system error code 5(Access is denied.).
我在即时客户端文件夹中创建了一个文件 test.txt,其中包含“我可以阅读此内容吗?” - 我是,没问题。
我在服务器上启动 procmon 以了解会发生什么。在sql服务器上使用上述命令时,得到REPARSE(因为是链接!),然后SUCCESS,sqlcmd控制台显示文件。
在 SSMS 中(在我的本地工作站上)使用此命令时,首先出现 REPARSE (OK),然后出现 ACCESS DENIED。
在这两种情况下,它是同一个用户帐户,在 procmon 的详细信息中显示为“Impersonating”。防火墙肯定没有问题,网络共享上的tnsnames.ora文件的读取权限是授予Everyone的。我还可以在本地工作站上创建一个 ODBC 项,并且可以从这里连接和查询数据库。
我过去这样做过,不知道多久了,而且从来没有遇到过问题。我错过了什么?
解决方法
您为什么要尝试通过 SQL 读取 tnsnames.ora 文件?当您的应用程序连接到数据库时,Oracle 库将(应该)在内部打开它并使用它。
网络配置文件的默认位置显示在 Instant Client 安装文档中。在您的情况下,它将是 C:\InstantClientx64\network\admin
。除非您设置了 TNS_ADMIN
变量,否则首先创建此子目录并将 tnsnames.ora 放入其中。
(Windows 上 Instant Client 的未来版本将自动创建 network\admin
子目录,类似于使用 Linux Instant Client 软件包创建它的方式)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。