必须分六类调用dbms_metadata导出用户scott的完整ddl:user、profile、tablespace_quota、system_grant、role_grant、default_role、object_grant,缺一不可;用户名须全大写;set long 100000等参数须提前设置。

导出单个用户的所有授权DDL语句,不能只调用一次 DBMS_METADATA.GET_GRANTED_DDL —— 它按权限类型严格分离,漏掉任意一类,新用户就可能无法登录或权限失效。
必须分四类调用 GET_GRANTED_DDL
对象权限、系统权限、角色权限、默认角色这四类必须分别查询,缺一不可:
-
DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT', 'SCOTT'):生成GRANT SELECT ON EMP TO HR类语句,自动合并表级与列级授权 -
DBMS_METADATA.GET_GRANTED_DDL('SYSTEM_GRANT', 'SCOTT'):输出GRANT CREATE SESSION TO "SCOTT",没这句用户连不上库 -
DBMS_METADATA.GET_GRANTED_DDL('ROLE_GRANT', 'SCOTT'):返回GRANT "CONNECT" TO "SCOTT",但不递归展开角色内容 -
DBMS_METADATA.GET_GRANTED_DDL('DEFAULT_ROLE', 'SCOTT'):生成ALTER USER SCOTT DEFAULT ROLE ALL或显式列表,否则即使授了角色,登录后也不激活
用户名必须全大写;小写或带引号(如 'scott' 或 "scott")会导致返回空 CLOB,不是报错,极易误判为“无权限”。
SET LONG 不够大会导致脚本执行失败
GET_GRANTED_DDL 返回的是 CLOB,SQL*Plus 默认 LONG 为 80 字符,远不够容纳多条 GRANT 语句。一旦截断,执行时会报 ORA-00922: missing or invalid option。
- 执行前务必先运行:
SET LONG 100000 - 建议同步设:
SET PAGESIZE 0(去页头页脚)、SET FEEDBACK OFF(避免干扰行) - 若仍为空输出,先确认该类权限确实存在(例如用户未被授予任何角色,则
ROLE_GRANT返回空 CLOB 是正常行为)
别忘了 TABLESPACE_QUOTA 和 PROFILE
仅靠四类 GET_GRANTED_DDL 还不完整。一个可正常使用的用户还需:
- 表空间配额:
DBMS_METADATA.GET_GRANTED_DDL('TABLESPACE_QUOTA', 'SCOTT') - PROFILE 定义:
DBMS_METADATA.GET_DDL('PROFILE', (SELECT profile FROM dba_users WHERE username = 'SCOTT')),否则密码策略、资源限制等会丢失 - 用户本身定义:
DBMS_METADATA.GET_DDL('USER', 'SCOTT')(注意:这是GET_DDL,不是GET_GRANTED_DDL)
这些语句需和权限语句拼在一起,并按顺序执行:建用户 → 设 PROFILE → 配表空间配额 → 授系统权限 → 授角色 → 设默认角色 → 授对象权限。
最容易被忽略的点是 DEFAULT_ROLE 和 SYSTEM_GRANT —— 它们不体现在数据字典视图的“权限列表”里,但直接决定用户能否连接、能否使用已授角色。导出脚本里少这两条,导入后第一件事就是连不上库。











