能执行 exp 全库导出的用户是被显式授予 EXP_FULL_DATABASE 角色者;需查询 DBA_ROLE_PRIVS 视图中 GRANTED_ROLE = 'EXP_FULL_DATABASE' 的记录,且该角色必须直接授予并设为 DEFAULT_ROLE,SYS/SYSTEM 也不默认拥有,须实际验证。
要查出哪些用户能执行 exp 全库导出(即带 full=y 参数),关键不是看“能不能连上”,而是看是否被授予了 exp_full_database 角色——这是 oracle 控制全库导出能力的唯一显式权限开关。
为什么只查 EXP_FULL_DATABASE 角色?
Oracle 并不靠 SELECT ANY TABLE 或 DBA 角色来放行 full=y 导出。即使一个用户有 DBA 角色,若没显式授予 EXP_FULL_DATABASE,exp ... full=y 仍会报错 ORA-01031: insufficient privileges。该角色是独立存在的系统角色,必须显式授予。
-
EXP_FULL_DATABASE是唯一决定能否用exp命令导出所有用户的对象和数据的权限标识 -
IMP_FULL_DATABASE是配套导入权限,但不影响导出判断 -
SELECT_CATALOG_ROLE或DATAPUMP_EXP_FULL_DATABASE(Data Pump 场景)与此无关,exp工具不认它们
如何准确查出拥有该权限的用户?
直接查 DBA_ROLE_PRIVS 视图,筛选 GRANTED_ROLE = 'EXP_FULL_DATABASE':
SELECT GRANTEE, GRANTED_ROLE, ADMIN_OPTION, DEFAULT_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE = 'EXP_FULL_DATABASE';
注意:
- 结果中的
GRANTEE可能是用户名,也可能是角色名(比如CONNECT被授了该角色,那所有拥有CONNECT的用户间接获得——但exp不递归检查,只认直接授予) - 如果某用户通过角色间接获得该权限(例如:角色 A 有
EXP_FULL_DATABASE,用户 U 被授予角色 A),exp仍会拒绝,除非该角色是其DEFAULT_ROLE - 必须用具有
SELECT_CATALOG_ROLE或DBA权限的账号执行该查询
容易漏掉的隐性情况:SYS 和 SYSTEM 默认就有?
不是默认就有。从 Oracle 10g 起,SYS 和 SYSTEM 用户并不自动拥有 EXP_FULL_DATABASE 角色——他们能导出全库,是因为拥有 DBA 角色,而 DBA 角色在多数安装中已被显式赋予了 EXP_FULL_DATABASE。但这个依赖关系不是强制的,它取决于建库时脚本或后续手动授权。
- 不能假设
DBA用户一定可full=y导出,必须验证EXP_FULL_DATABASE是否真在他们的DBA_ROLE_PRIVS记录里 - 有些加固过的生产库会剥离
DBA中的EXP_FULL_DATABASE,仅保留必要权限 - 用
SELECT * FROM ROLE_ROLE_PRIVS WHERE ROLE = 'DBA'查看DBA角色本身是否包含该子角色
真正起作用的永远是 DBA_ROLE_PRIVS 中那条明确的 GRANTED_ROLE = 'EXP_FULL_DATABASE' 记录,而不是权限描述、角色名或直觉判断。任何绕过这个视图的推测都可能漏掉实际可用的导出账号,或误判不可用账号。


















