我的Solaris用户oscar是包含oracle用户帐户的一部分或一个组。
我创建了一个目录,并在其中放置了一个文件;使其所有者和组可读
mkdir /tmp/tdir
echo $$ > /tmp/tdir/foo.txt
chmod 440 /tmp/tdir/foo.txt然后,我以system身份登录并创建Oracle目录
CREATE OR REPLACE DIRECTORY tmp_tdir AS '/tmp/tdir';然后,我以unix用户oscar的身份登录,从数据库服务器启动一个sqlplus会话(作为系统)。
我可以通过在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进程是以文件所有者身份运行的,为什么在删除组权限后无法读取该文件?
发布于 2014-12-10 23:11:28
在这个问题的上下文中,操作系统身份验证似乎并不重要。
问题是,如果oracle用户没有访问权限,utl_file将不允许访问文件。
与文件关联的组包含oracle用户。因此,当启用组读取位时,我只能使用utl_file读取文件。
发布于 2014-12-10 03:07:53
OS用户和Oracle用户是两个不同的东西。
OS身份验证并不意味着您的oracle实例将以给定用户的身份运行。例如,在我的Linux系统上,oracle XE以操作系统用户Oracle的身份运行。这是作为操作系统级别授予或拒绝文件访问权限的唯一重要标识。
您可以使用一个简单的ps命令检查这一点。
请注意,如果您的OS/文件系统使用的是或 (在某种程度上相当于SELinux),事情可能会比这复杂得多。
https://stackoverflow.com/questions/27386648
复制相似问题