导出Oracle用户权限需调用四类DBMS_METADATA函数并设置SQL*Plus参数:SET LONG 100000、PAGESIZE 0、FEEDBACK OFF、TRIMSPOOL ON;用户名须大写;还需手动添加CREATE USER、PROFILE和QUOTA语句。

只用 DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT', 'U1') 是不够的
很多人导出权限时只调一次这个函数,结果脚本里只有 GRANT SELECT ON HR.EMP TO U1 这类语句,但新用户连不上、查不了、建不了对象——因为缺了登录权限、角色、默认角色设置。Oracle 中一个可用用户至少依赖四类显式授权:SYSTEM_GRANT(如 CREATE SESSION)、ROLE_GRANT(如 GRANT CONNECT TO U1)、DEFAULT_ROLE(如 ALTER USER U1 DEFAULT ROLE CONNECT)、OBJECT_GRANT。漏掉任意一类,权限就不完整。
必须设 SET LONG 100000,否则生成的脚本会截断
DBMS_METADATA.GET_GRANTED_DDL 返回的是 CLOB,SQL*Plus 默认 LONG 只有 80 字符,而一条含多个对象的 GRANT 语句轻松超 2000 字符。截断后脚本像这样:
GRANT SELECT ON HR.EMP TO U1; GRANT INSERT ON HR.
执行直接报 ORA-00922: missing or invalid option。必须提前在 SQL*Plus 或 SQLcl 中运行:
SET LONG 100000SET PAGESIZE 0SET FEEDBACK OFFSET TRIMSPOOL ON
不关 FEEDBACK 会混入 1 row selected;不设 PAGESIZE 0 可能插入页眉页脚,污染脚本。
用户名必须全大写,小写或带引号返回空 CLOB
调用 DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT', 'u1') 或 DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT', '"u1"') 都不会报错,但返回空值(长度为 0 的 CLOB),容易误判为“该用户没权限”。正确写法是:
SELECT DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT', 'U1') FROM DUAL;
源库查 dba_users.username 确认大小写,别凭记忆手输。
克隆权限 ≠ 克隆用户,三类基础配置必须手动补
DBMS_METADATA.GET_GRANTED_DDL 只管“授了什么”,不管“用户怎么建”“资源怎么限”。以下三项必须加到脚本最前面,且顺序不能错:
- 先
CREATE USER new_user IDENTIFIED BY VALUES 'xxx'(从dba_users.password查哈希复用,避免重置密码) - 再
ALTER USER new_user PROFILE old_profile(如果原用户用了非默认 profile) - 然后
ALTER USER new_user QUOTA UNLIMITED ON users(漏这个最常见:用户能登录、能查表,一建表就报ORA-01536)
表空间配额为 0 是静默失败点,排查时容易绕远路。











