GRANT OPTION仅用于对象权限且级联回收,ADMIN OPTION仅用于系统权限和角色授权且非级联;混用会报ORA-01031或ORA-01929。

GRANT OPTION 和 ADMIN OPTION 完全不能混用,也不是可选配置——它们绑定在不同权限类型上,用错直接报 ORA-01031 或 ORA-01929。
GRANT OPTION 只能用于对象权限(如 SELECT、UPDATE)
它控制的是「谁能把这张表的查询权再给别人」。比如:
GRANT SELECT ON scott.emp TO alice WITH GRANT OPTION;
alice 就能再执行:
GRANT SELECT ON scott.emp TO bob;
但一旦 DBA 执行:
REVOKE SELECT ON scott.emp FROM alice;
bob 的 SELECT 权限会立刻失效——这就是级联回收。DBA 无法单独对 bob 执行 REVOKE SELECT ON scott.emp FROM bob,语句会报错 ORA-01749。
- 只适用于对象权限:SELECT / INSERT / UPDATE / DELETE / EXECUTE / REFERENCES 等
- 不支持系统权限(如
CREATE SESSION)或角色授权 - 被授予权限的用户不能把该权限授予 PUBLIC(会报 ORA-01926)
- 回收时强制级联,且不可绕过
ADMIN OPTION 只能用于系统权限和角色授权
它解决的是「谁能帮 DBA 分发建库、连库这类全局能力」。例如:
GRANT CREATE SESSION TO alice WITH ADMIN OPTION;
alice 就能执行:
GRANT CREATE SESSION TO bob;
但如果 DBA 后来执行:
REVOKE CREATE SESSION FROM alice;
bob 的 CREATE SESSION 不受影响——这是非级联行为。DBA 可以随时单独回收 bob 的权限:REVOKE CREATE SESSION FROM bob。
- 仅适用于系统权限(
CREATE TABLE、ALTER SYSTEM等)和角色(GRANT dba TO alice WITH ADMIN OPTION) - 不能用于对象权限,否则报 ORA-01929
- 角色可以嵌套授权:
GRANT role_a TO role_b WITH ADMIN OPTION - 回收后,下游已授出的权限仍有效,必须显式逐个收回
常见错误现象与排查点
ORA-01031(权限不足)常发生在:用户试图用 WITH GRANT OPTION 授予系统权限,或用 WITH ADMIN OPTION 授予对象权限;ORA-01929 则明确提示「no privileges to GRANT」,基本就是选项和权限类型不匹配。
- 检查权限类型:
SELECT * FROM system_privilege_map WHERE name = 'CREATE SESSION'是系统权限;SELECT * FROM table_privilege_map WHERE privilege = 'SELECT'是对象权限 - 查当前用户能授什么:
SELECT * FROM user_sys_privs WHERE admin_option = 'YES'(有 ADMIN OPTION 的系统权限);SELECT * FROM user_tab_privs WHERE grantable = 'YES'(有 GRANT OPTION 的对象权限) - MySQL 用户注意:MySQL 只有
WITH GRANT OPTION,且行为更接近 Oracle 的 ADMIN OPTION(不级联),别按 MySQL 经验反推 Oracle
最易忽略的一点:WITH ADMIN OPTION 授出的角色,其内部包含的对象权限仍受 WITH GRANT OPTION 约束——也就是说,角色本身可转授,但角色里封装的表权限是否能再授,取决于当初给那个角色赋对象权限时有没有加 WITH GRANT OPTION。


















