impdp不创建用户,只重建对象权限;需确保被授权用户和授权者已存在,注意大小写敏感问题,系统权限、目录权限及角色需手动补全。

impdp不创建用户,只重建对象权限
Oracle Data Pump导入默认不会创建用户,哪怕你用了FULL=Y。它只负责导入表、索引、视图等对象,并尝试恢复这些对象上的OBJECT_GRANT(比如GRANT SELECT ON scott.emp TO app_user)。但前提是:被授权的用户(如app_user)和授权者(如scott)都必须已存在于目标库中。否则就会报ORA-39083 + ORA-01917: user or role 'xxx' does not exist——这不是权限“丢失”,而是根本没机会赋权。
大小写敏感导致“用户存在却找不到”
Oracle用户名在双引号内创建时是大小写敏感的。源库导出的是"For_Query",而你在目标库执行CREATE USER for_query IDENTIFIED BY ...(没加引号),实际创建的是全小写的FOR_QUERY。impdp匹配时严格按原样比对,"For_Query" ≠ FOR_QUERY,照样报ORA-01917。
- 查用户真实名称:
SELECT username FROM dba_users WHERE UPPER(username) = 'FOR_QUERY'; - 确认是否带引号:
SELECT '"' || username || '"' FROM dba_users WHERE username LIKE '%For%'; - 重建时务必用相同大小写+引号:
CREATE USER "For_Query" IDENTIFIED BY ...;
系统权限未随对象导入自动授予
impdp只处理对象级权限(SELECT、INSERT等),不处理系统权限(CREATE SESSION、UNLIMITED TABLESPACE等)。即使用户存在、对象权限也成功恢复,用户仍可能连不上库或插不了数据——因为缺CREATE SESSION或配额。
- 检查缺失的系统权限:
SELECT privilege FROM dba_sys_privs WHERE grantee = 'APP_USER'; - 补授权(需DBA):
GRANT CREATE SESSION, UNLIMITED TABLESPACE TO "APP_USER"; - 注意表空间配额:
ALTER USER "APP_USER" QUOTA UNLIMITED ON "USERS";
目录权限和角色依赖被忽略
如果导入涉及GRANT READ ON DIRECTORY或GRANT ROLE,而目标库缺少对应DIRECTORY对象或角色定义,也会静默失败——impdp跳过这类失败项但不中断作业,日志里只记ORA-39083,容易漏看。
- 提前核对所有被引用的
DIRECTORY:SELECT directory_name, directory_path FROM dba_directories; - 确认角色是否存在:
SELECT role FROM dba_roles WHERE role IN ('APP_ROLE', 'QUERY_ROLE'); - 角色需显式创建并授权:
CREATE ROLE "QUERY_ROLE"; GRANT SELECT ON ... TO "QUERY_ROLE";
ORA-39083,其中只有两三行告诉你哪个用户/角色/目录缺失——其余都是连锁失败。盯住日志里第一个ORA-01917或ORA-01950,它大概率是根因。











