必须显式授予READ或WRITE权限,否则UTL_FILE、外部表、DBMS_DATAPUMP全部失败;CREATE DIRECTORY需CREATE ANY DIRECTORY系统权限,不通过角色继承,且目录权限无隐式继承、不支持PUBLIC授权。
必须显式授予 read 或 write 权限,否则 utl_file、外部表、dbms_datapump 全部失败——哪怕你是 dba,哪怕目录路径在服务器上真实存在且可读写。
CREATE DIRECTORY 必须由有 CREATE ANY DIRECTORY 权限的用户执行
普通用户即使拥有 DBA 角色,也不能直接建目录;CREATE DIRECTORY 是系统权限,不通过角色继承。常见错误是用应用账号执行:
-
ORA-01031: insufficient privileges—— 不是路径写错,是权限根本没给到 - 必须用
SYS AS SYSDBA或已显式授过GRANT CREATE ANY DIRECTORY TO user_name的账号操作 - 目录名(如
'MY_DUMP_DIR')不区分大小写,但 OS 路径字符串(如'/u01/app/oracle/dump')必须字面量完全一致:末尾不能多斜杠、大小写敏感、不支持软链接
GRANT READ, WRITE ON DIRECTORY 不能授给 PUBLIC 或宽泛角色
授权目标只能是具体用户或自定义角色,GRANT ... TO PUBLIC 看似省事,实则审计通不过,且带来越权风险。更关键的是:
-
GRANT EXECUTE ON DIRECTORY是无效语法,会直接报ORA-00990: missing or invalid privilege - 只读场景(如外部表加载)只需
GRANT READ;写文件(UTL_FILE.PUT_LINE、Data Pump 日志)才需WRITE - 权限生效无需重启数据库,但已有会话需重新连接才能识别新权限
UTL_FILE.FOPEN 报 ORA-29280 或 ORA-29283 的真实原因
这两个错误 90% 都不是 SQL 层权限问题,而是底层 OS 层断链:
-
ORA-29280: invalid directory path:Oracle 进程(通常是oracle用户)无法访问该路径,常见于:chmod 777触发安全限制、SELinux 启用、NFS 挂载缺noac选项 -
ORA-29283: invalid file operation:路径存在但无对应读写权限,或属主不是oracle用户(哪怕chmod 755也不行) - 验证方式必须是:用
sudo -u oracle touch /path/to/dir/test.txt+ 数据库内执行BEGIN UTL_FILE.FOPEN('MY_DIR', 'x.txt', 'W'); END;
多租户(CDB/PDB)和 RAC 下的特殊约束
目录对象不是全局共享的:
- 在 PDB 中创建的
DIRECTORY只对该 PDB 有效,CDB$ROOT 里不可见,也不能跨容器使用 - RAC 环境下,目录路径必须在所有节点本地可访问(比如用共享 NFS,且各节点都挂载到相同路径)
- 删掉一个
DIRECTORY不会让依赖它的外部表或 Data Pump 参数立刻失效——它们仍能编译、查询元数据,直到真正执行时才报错
最容易被忽略的一点:目录对象本身归 SYS 所有,ALL_DIRECTORIES 视图里 OWNER 永远是 SYS,所以不存在 USER_DIRECTORIES 视图。权限检查完全绕过常规对象权限模型,纯靠显式 GRANT 控制,没有隐式继承,也没有默认权限。


















