Oracle目录 - 难以读取禁用组读取的文件(oracle在组中)

时间:2014-12-09 18:54:55

标签: oracle unix directory

我的Solaris用户oscar是包含oracle用户帐户的部分或组。

我创建一个目录并在其中放置一个文件;使其所有者和群组可读

mkdir /tmp/tdir
echo $$ > /tmp/tdir/foo.txt
chmod 440 /tmp/tdir/foo.txt

然后我以系统身份登录并创建Oracle目录

CREATE OR REPLACE DIRECTORY tmp_tdir AS '/tmp/tdir';

然后我从数据库服务器启动sqlplus会话(作为系统),同时以unix用户oscar身份登录。

我可以通过在sqlplus

中执行此代码段来读取文件内容
set serveroutput on
DECLARE
  fileHandler UTL_FILE.FILE_TYPE;
  buffer    CLOB;
BEGIN
  fileHandler := UTL_FILE.FOPEN('TMP_TDIR', 'foo.txt', 'r');
  UTL_FILE.GET_LINE(fileHandler, buffer);
  dbms_output.put_line('File Data: '||buffer);
  UTL_FILE.FCLOSE(fileHandler);
END;
/

现在,当我从文件中删除组读取权限时,上面的代码段不再有效。相反,我遇到了错误

ERROR at line 1:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 5

为什么在删除组权限后我无法读取文件,因为oracle sqlplus进程作为文件所有者运行?

2 个答案:

答案 0 :(得分:1)

在这个问题的背景下,OS认证似乎并不重要。

问题是如果 oracle 用户没有访问权限,utl_file将不允许文件访问。

与该文件关联的组包含 oracle 用户。因此,当组读取位被启用时,我只能用utl_file读取文件。

答案 1 :(得分:0)

OS用户和Oracle用户是两回事。

操作系统身份验证并不意味着您的oracle实例将以给定用户的身份运行。例如,在我的Linux系统上,Oracle XE作为操作系统用户 oracle 运行。这是唯一对于授予或拒绝作为操作系统级别的文件访问权限的标识。

您可以使用简单的ps命令检查它。


请注意,如果您的操作系统/文件系统使用ACLSolaris Trusted Extension(稍微相当于SELinux),事情可能会比这更复杂。