微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Instant Client 连接到 SQL Server 中的链接服务器 (Oracle)

如何解决使用 Instant Client 连接到 SQL Server 中的链接服务器 (Oracle)

我需要使用 MS sql Server (2019) 链接服务器连接到远程数据库 (Oracle)。到目前为止我做了什么:

  1. 在运行 sql 服务器的机器上安装了 Oracle Instant Client x64 和 ODBC 驱动程序
  2. 在 Oracle Instant 客户端文件夹内创建了一个指向中央 TNSNAMES.ORA(在网络中的文件共享上)的符号链接
  3. 设置必要的环境变量
  4. 在这台机器上的 Oracle 服务器上创建了一个数据库的 ODBC 连接
  5. 重新启动 MS sql Server
  6. 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?