c - Oracle OCI - 以另一个用户身份运行时失败并出现 ORA-12705

标签 c oracle unix oracle-call-interface instantclient

我有一个使用 OCI 与数据库对话的 C 应用程序。我使用的是即时客户端方法,因此服务器上没有独立的 Oracle 安装 - 只有几个应用程序链接到的库。

通常,应用程序以用户 dai 身份运行,一切正常。但是如果应用程序以另一个用户身份运行(在 dai 组中),它运行失败,报告:

Error while trying to retrieve text for error ORA-12705

所以我可以想象这是一个权限错误,但我不确定它试图访问哪些文件。 Oracle 库的权限是

dai:/dai/oracle/lib> ls -l
total 201872
-rwxrwxrwx   1 dai      dai        24719097 16 Feb 2009  libclntsh.a
-rwxrwxrwx   1 dai      dai         5972457 16 Feb 2009  libocci.a
-rwxrwxrwx   1 dai      dai        72651344 04 Jun 2010  libociei.so

正如您所猜测的那样,主要的 OCI 库是静态链接的,但是有一个动态链接的库(不知道为什么,但是 AIX instantclient 包附带了这些文件...)。从两个用户看来,我的 LIBPATH 都正常:

LIBPATH=/dai/oracle/lib

我还需要检查哪些其他权限?

编辑:我刚刚尝试运行 truss(AIX 相当于 Linux strace)来查看发生了什么。当以 dai 用户身份运行时,我看不到它读取任何意外文件。 Truss 似乎在跟踪 set-uid 程序时遇到问题 - C 应用程序的权限设置如下:

dai:/dai/bin> ls -l stats_backup
-rwsrwsr-x   1 dai      dai         6173358 Aug 12 10:08 stats_backup

所以我执行了 chmod a-s 并再次尝试,现在可以了!

所以程序在没有 s 位的情况下运行正常,但是当我把它放回去时,它又崩溃了。我无法在设置了 s 位的情况下运行 truss,这使得很难找出为什么会这样。如果没有设置 s 位,该程序在其他情况下无法运行,因此这不是一个可行的解决方案,但希望它能指出问题所在。

最佳答案

可能有一些 Oracle 数据文件位于您的其他用户无权访问的地方。 According to Google, ORA-12705发生这种情况是因为无法访问 NLS 数据文件(无论它们在哪里),或者可能存在一些环境变量问题。

关于c - Oracle OCI - 以另一个用户身份运行时失败并出现 ORA-12705,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7595403/

相关文章:

sql - 在Oracle中删除记录时出现“No more data to read from socket”错误

oracle - 在子句中使用Oracle表类型-编译失败

java - 非常快地将多行插入 Oracle 数据库

c - 如何在循环中使用管道,我的正确吗?

regex - Grep 表达式排除了我想要的一些匹配项

linux - 比较 AIX 中的 mount 和/etc/filesystems

c - C 中的字符串标记化和 strstr - 段错误

c++ - 更改 syslog 日志路径

c - 将数组传递给函数时的双指针间接

c - STM32 STM32CubeF4 USB CDC操作