不能。DATAPUMP_EXP_FULL_DATABASE和DATAPUMP_IMP_FULL_DATABASE并非可直接授予用户的SQL角色,而是Data Pump作业内部使用的系统权限集合别名,须显式授予EXP_FULL_DATABASE、IMP_FULL_DATABASE、CREATE SESSION等具体权限,且必须直接授予、不可通过角色间接继承。
Oracle中DATAPUMP角色到底能不能直接授给普通用户
不能。exp_full_database 和 imp_full_database 是系统预定义角色,但 datapump_exp_full_database 和 datapump_imp_full_database 并不是可直接授予用户的“角色”,而是数据泵作业(data pump)在运行时内部使用的**系统权限集合别名**——它们本身不是 sql 层面的 role,不能用 grant ... to user 授予。
真正需要授予哪些权限才能让普通用户执行expdp/impdp
要让非 DBA 用户运行 expdp 或 impdp,必须显式授予以下两类权限:
-
CREATE SESSION(登录权限,基础必备) -
EXP_FULL_DATABASE(导出全库对象,含其他用户 schema)或SELECT_CATALOG_ROLE(仅导出自己有 SELECT 权限的对象) -
IMP_FULL_DATABASE(导入到任意 schema,含跨用户)或LOAD_OBJECTS(仅导入到自己 schema) - 若涉及网络链接(
NETWORK_LINK),还需CREATE DATABASE LINK - 若导入时要创建表空间、用户等 DDL,则需额外
CREATE TABLESPACE、CREATE USER等,这些不属于 DATAPUMP 范畴
为什么授予EXP_FULL_DATABASE后仍报ORA-31631: privileges are required
常见原因不是权限没给,而是权限未生效或作用域不对:
- 权限必须通过
GRANT ... TO user直接授予,**不能通过中间角色间接继承**(比如 A 角色有 EXP_FULL_DATABASE,再把 A 授给用户,该用户仍无法 expdp) - 用户必须有对目标 schema 的访问权限:导出别人 schema 需
SELECT+READ对象权限,或拥有EXP_FULL_DATABASE;导入到别人 schema 需IMP_FULL_DATABASE+ 目标 schema 的INSERT/ALTER等 - 执行
expdp时未指定SCHEMAS=或SCHEMA参数,默认尝试导出当前用户 schema,但如果用户没有SELECT_CATALOG_ROLE或对应对象权限,也会失败 - 检查是否启用了 Oracle 的细粒度访问控制(FGAC)或 Virtual Private Database(VPD),可能拦截了数据字典查询
最小可行授权示例(仅限本用户导出+导入自身对象)
如果只是让 myuser 能导出/导入自己的表,不需要 DBA 级权限,推荐这样操作:
GRANT CREATE SESSION TO myuser; GRANT SELECT_CATALOG_ROLE TO myuser; GRANT LOAD_OBJECTS TO myuser;
然后用 expdp myuser/password DIRECTORY=dp_dir DUMPFILE=my.dmp SCHEMAS=myuser 和 impdp myuser/password DIRECTORY=dp_dir DUMPFILE=my.dmp 即可。注意:LOAD_OBJECTS 是 12c 引入的权限,替代旧版的 EXP_FULL_DATABASE 对单 schema 的轻量需求;低于 12c 可用 EXP_FULL_DATABASE 但需确认版本兼容性。
真正容易被忽略的是权限的“直接授予”要求和 SELECT_CATALOG_ROLE 的隐式依赖——它不显式出现在 Data Pump 文档里,但缺失时 expdp 连 DBA_TABLES 都查不到,直接报错。











