无效。GRANT READ, WRITE ON DIRECTORY 语法有效,Oracle 明确支持该授权语法,必须显式授予READ或WRITE权限,不可用EXECUTE或ALL代替,且授权后仍需确保OS层oracle用户对路径具有对应权限。
GRANT READ, WRITE ON DIRECTORY 语法是否有效?
无效。grant 语句不支持直接对 directory 对象授予 read 或 write 权限。oracle 中的 directory 是数据库级逻辑对象,其访问控制完全依赖操作系统层权限,不是靠 sql 授权实现的。
你执行类似 GRANT READ ON DIRECTORY dump_dir TO scott 会报错:ORA-00942: table or view does not exist(因为 DIRECTORY 不是表/视图),或更明确的 ORA-01749: you may not GRANT/REVOKE privileges to/from yourself(若误写为当前用户)。
真正起作用的只有两件事:OS 层路径属主+权限 + 数据库中 CREATE DIRECTORY 的路径一致性。
为什么必须由 root 执行 chown oracle:oinstall?
Oracle 后台进程(如 sqlldr、UTL_FILE、外部表)始终以 oracle 用户身份运行,它无法绕过 Linux 的 UID/GID 校验。哪怕你把目录 chmod 777,只要属主不是 oracle 或其所属组(如 oinstall 或 dba),UTL_FILE.FOPEN 就会失败,报 ORA-29283: invalid file operation。
-
ls -ld /u01/app/oracle/dump输出第一列必须含oracle(如drwxr-xr-x 2 oracle oinstall ...) - 用
chown oracle:oinstall /u01/app/oracle/dump(需 root 权限) - 禁止设为
root:root—— Oracle 进程无权读写 - 组名不强制是
oinstall,但必须是oracle用户实际所属的组(可用id -Gn oracle查)
chmod 755 是底线,777 反而被 Oracle 拒绝
Oracle 12c 起默认启用安全拦截:若目录权限过于宽松(如 chmod 777 或 chmod o+w),即使属主正确,UTL_FILE.FOPEN 也会静默拒绝,报 ORA-29280: invalid directory path。这不是 bug,是主动防护。
正确做法:
-
chmod 755 /u01/app/oracle/dump(owner rwx, group rx, other rx) - 写入能力靠 owner 身份保障,无需开放 other 写权限
- 避免任何
o+w、o+x、777—— 它们会让 Oracle 认为目录不可信 - NFS 挂载需加
noac或soft选项,否则权限可能延迟生效
CREATE DIRECTORY 路径必须字面量完全匹配 OS 路径
数据库里的 DIRECTORY 对象只是字符串别名,Oracle 不做路径解析。哪怕只差一个末尾斜杠、大小写或用了软链接,都会导致后续操作失败。
错误示例:
-
CREATE DIRECTORY dump_dir AS '/u01/app/oracle/dump/'(末尾多/)→ORA-29283 -
CREATE DIRECTORY dump_dir AS '/U01/app/oracle/dump'(U01大写)→ 找不到路径 -
CREATE DIRECTORY dump_dir AS '/u01/dump'(实际是软链接指向/backup/oracle_dump)→ 不被识别
验证方式:切换到 oracle 用户,手动执行 echo test > /u01/app/oracle/dump/test.txt;再在 SQL*Plus 中跑 BEGIN UTL_FILE.FOPEN('DUMP_DIR', 'test.txt', 'W'); END; —— 两者都通才算真正就绪。











