with admin option 仅适用于系统权限和角色,不适用于对象权限;对象权限需用 with grant option,二者语义、级联行为及回收机制完全不同。

WITH ADMIN OPTION 适用于系统权限和角色,不适用于对象权限
Oracle 中 WITH ADMIN OPTION 只能用于授予系统权限(如 CREATE SESSION、CREATE TABLE)或角色(如 CONNECT、RESOURCE),不能用于对象权限(如 SELECT ON emp)。如果你在对象授权语句里加了它,会直接报错 ORA-01931: cannot grant WITH ADMIN OPTION on an object privilege。
对象权限要用 WITH GRANT OPTION,两者语义和回收行为完全不同,混用会导致权限失控或授权失败。
- 系统权限 +
WITH ADMIN OPTION→ 允许被授者再授系统权限/角色,且REVOKE不级联 - 对象权限 +
WITH GRANT OPTION→ 允许被授者再授该对象权限,且上游REVOKE会级联失效下游权限 - 想让某用户能创建用户或建表,并把这能力转授他人?必须用
WITH ADMIN OPTION,且只能搭配系统权限或角色
回收权限时不会自动清理下游授权,必须手动处理
这是最常被忽略的风险点:当你执行 REVOKE CREATE SESSION FROM user_a,哪怕 user_a 是用 WITH ADMIN OPTION 获得的权限,user_b 手里仍保留 CREATE SESSION。数据库不会通知你、也不会自动清理。
这意味着权限可能长期滞留,尤其在人员变动或账号停用后,形成“幽灵权限”。
- 查下游授权链:用
SELECT * FROM dba_sys_privs WHERE grantee = 'USER_B' AND privilege = 'CREATE SESSION'只能看到谁有权限,看不到谁授的 - 真正溯源要结合
DBA_ROLE_PRIVS和审计日志(如果开启AUDIT SYSTEM GRANT) - 安全做法是:每次回收上游权限前,先运行脚本扫描所有下游用户,显式执行
REVOKE ... FROM ...
避免用 WITH ADMIN OPTION 授予高危系统权限
不是所有系统权限都适合开放传递。比如 GRANT ANY PRIVILEGE、ALTER DATABASE、DROP ANY TABLE 这类权限一旦配上 WITH ADMIN OPTION,等于把部分 DBA 能力交给了普通用户。
典型误操作是给应用运维账号授 RESOURCE 角色时加 WITH ADMIN OPTION,而 RESOURCE 默认含 UNLIMITED TABLESPACE 和建表/索引等权限,间接放大风险。
- 优先用最小权限原则:只授
CREATE SESSION+CREATE TABLE等明确需要的单个权限,而非整个RESOURCE - 禁用组合:永远不要对
DBA角色或GRANT ANY *类权限使用WITH ADMIN OPTION - 若必须下放管理能力,建议通过自定义角色封装,并限制该角色只能被特定用户授予
WITH ADMIN OPTION 的授权记录不会写入 DBA_TAB_PRIVS
很多人查权限时习惯翻 DBA_TAB_PRIVS 或 DBA_COL_PRIVS,但这些视图只存对象权限。系统权限和角色授权走的是 DBA_SYS_PRIVS 和 DBA_ROLE_PRIVS —— 而且它们**不记录是否带 WITH ADMIN OPTION**。
也就是说,你从这些视图里看到 user_a 有 CREATE VIEW,但无法判断他能不能再授给别人。这个信息只存在于授权动作本身,没有持久化元数据字段。
- 确认某用户是否具备转授权能力,唯一可靠方式是看当初的
GRANT语句历史(如审计日志、部署脚本、变更工单) -
USER_SYS_PRIVS视图里有个ADMIN_OPTION列,但仅对当前用户有效;其他用户需查DBA_SYS_PRIVS,而它没这个字段 - 生产环境建议强制要求所有带
WITH ADMIN OPTION的授权必须登记到配置管理库,并标注用途和有效期
实际权限治理中最难的不是加权限,而是知道哪些权限是从哪来的、还能传几层、现在谁还拿着。WITH ADMIN OPTION 让授权链变长,也把责任分散了——这点在权限复核和等保检查时最容易暴露问题。











