impdp默认不导入任何权限,必须expdp时用CONTENT=ALL或INCLUDE=GRANT显式导出授权语句,且目标库需提前创建用户、角色、表空间;REMAP_SCHEMA不修改GRANT中的schema名,权限缺失会静默跳过。

默认不导入任何权限——哪怕只导一个用户,impdp 也会静默跳过所有 GRANT,连 GRANT SELECT ON scott.emp TO hr 都不会执行,查表直接报 ORA-00942。
导出时必须显式包含 GRANT
只写 expdp SCHEMAS=scott,哪怕加了 CONTENT=DATA_ONLY 或不加参数,默认 dump 文件里只有对象定义和数据,不含任何授权语句。导入时 impdp 根本不会尝试还原权限。
-
CONTENT=ALL最稳妥:导出表、索引、约束、视图、同义词、触发器 + 所有GRANT(含WITH GRANT OPTION链路) -
INCLUDE=GRANT仅导“被授方”视角的授权,比如GRANT SELECT ON scott.emp TO hr,但不记录是谁授的权,也无法还原授权链 - 别信
GRANTS=YES——这是impdp的默认值,但前提是 dump 文件里真有GRANT记录;没导出来,设成YES也没用
目标库必须提前建好用户、角色和表空间
impdp 不会帮你执行 CREATE USER 或 CREATE ROLE。如果目标库没有 hr 用户,那所有 GRANT ... TO hr 都会失败并跳过,日志里只有一行轻描淡写的 ORA-39112: Dependent object type GRANT:"HR" skipped,不中断、不报错。
- 查源库密码哈希:
SELECT username, password FROM dba_users WHERE username = 'HR' - 在目标库执行:
CREATE USER hr IDENTIFIED BY VALUES 'xxx' DEFAULT TABLESPACE users(用查到的password值,避免重置密码) - 如有自定义角色(如
my_app_role),必须先在目标库运行CREATE ROLE my_app_role,再至少授予CONNECT和RESOURCE - 表空间也得提前建好,否则
REMAP_SCHEMA后对象无法落库,权限更无从生效
REMAP_SCHEMA 不改 GRANT 里的 schema 名
加 REMAP_SCHEMA=scott:hr 只影响表、索引等对象的属主,不影响 GRANT 语句中硬编码的 schema 名。比如 dump 里存的是 GRANT SELECT ON scott.emp TO hr,导入时仍按 scott.emp 解析——如果目标库没 scott 用户,或该表不在 scott 下,权限就挂了。
- 要么导出前确保源库
scott.emp存在且可访问(用于权限校验) - 要么导出时用
SCHEMAS=scott+CONTENT=ALL,导入时用REMAP_SCHEMA=scott:hr,同时确保目标库已建好hr用户和对应表空间 - 别指望
REMAP_SCHEMA能自动把GRANT SELECT ON scott.emp TO hr改成GRANT SELECT ON hr.emp TO hr——它不干这事
最易被忽略的点是:权限缺失不会报错,只会静默跳过。查不到表、执行报 ORA-00942、调存储过程报 ORA-01031,第一反应往往是“表没导过去”或“用户没权限”,其实 dump 里压根没存授权语句,或者目标库缺基础结构。动手前务必确认导出参数和目标库前置条件是否都到位。


















