我的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进程作为文件所有者运行?
答案 0 :(得分:1)
在这个问题的背景下,OS认证似乎并不重要。
问题是如果 oracle 用户没有访问权限,utl_file将不允许文件访问。
与该文件关联的组包含 oracle 用户。因此,当组读取位被启用时,我只能用utl_file读取文件。
答案 1 :(得分:0)
OS用户和Oracle用户是两回事。
操作系统身份验证并不意味着您的oracle实例将以给定用户的身份运行。例如,在我的Linux系统上,Oracle XE作为操作系统用户 oracle 运行。这是唯一对于授予或拒绝作为操作系统级别的文件访问权限的标识。
您可以使用简单的ps
命令检查它。
请注意,如果您的操作系统/文件系统使用ACL或Solaris Trusted Extension(稍微相当于SELinux),事情可能会比这更复杂。