ORA-01932错误源于角色未被授予WITH ADMIN OPTION,导致持有者无法转授;需由最初授予权限的用户(如SYS)重新以WITH ADMIN OPTION授予该角色,方可传递。

ORA-01932: ADMIN OPTION not granted for role role_name 这个错误说明你试图用一个没有 ADMIN OPTION 的角色去授予另一个用户该角色,而 Oracle 不允许这么做。
为什么执行 grant role_name to user_a 会报 ORA-01932?
根本原因是:当前执行授权的用户(比如 SYSTEM)虽然拥有该角色,但不是以 WITH ADMIN OPTION 方式获得的 —— 换句话说,这个角色是“只读持有”,不能转授。
- 角色本身必须先被授予者显式带上
WITH ADMIN OPTION,才具备向下授予的权限 -
DBA角色默认带ADMIN OPTION,但普通角色(如自定义的APP_DEVELOPER)不会自动携带 - 即使你是
SYSTEM用户,也不能绕过这个限制;SYSTEM没有对某个角色的ADMIN OPTION,照样报错
如何确认谁有该角色的 ADMIN OPTION?
查数据字典比猜快得多:
SELECT grantee, admin_option FROM dba_role_privs WHERE granted_role = 'YOUR_ROLE_NAME';
重点关注 ADMIN_OPTION 列是否为 YES。如果全是 NO,那就没人能直接用 GRANT 转授它。
- 注意:必须用具有
SELECT ANY DICTIONARY或DBA权限的账户查DBA_*视图 - 如果只有
USER_ROLE_PRIVS可查,那只能看到自己拥有的角色,看不到是否带ADMIN OPTION
解决 ORA-01932 的实际操作路径
不能跳过权限链,必须从源头补上 ADMIN OPTION:
- 找到最初授予该角色的用户(通常是
SYS或有GRANT ANY ROLE权限的人) - 由该用户重新执行:
GRANT your_role TO target_user WITH ADMIN OPTION - 之后,
target_user才能再用GRANT your_role TO another_user - 如果只是临时需要,也可以让
SYS直接授给最终用户,绕过中间人
别试图用 ALTER USER ... DEFAULT ROLE 或修改 user$ 表来绕过 —— 这些操作不合法,且可能破坏字典一致性。
容易忽略的关键点
很多人卡在“我明明是 DBA,为什么还不能授?”—— 因为 DBA 是角色,不是权限本身;它不自动赋予对任意角色的 ADMIN OPTION。Oracle 对角色传播做了严格隔离,哪怕你有 GRANT ANY ROLE,也仍需目标角色本身被授予时带 ADMIN OPTION 才能继续下放。这点和系统权限(如 CREATE TABLE)的传播逻辑完全不同。


















