ORA-01720本质是权限链断裂,因任一依赖对象缺失WITH GRANT OPTION导致转授权失败;需逐级显式授予,且权限回收不级联,残留视图仍可被调用但运行时报错。
ORA-01720 报错本质是权限链断裂,不是“传播失控”
ora-01720 错误提示 grant option does not exist for 'schema.object',说明当前用户对某个底层对象(比如表、视图)只有使用权限,但没有 with grant option,因此无法把上层依赖它的视图或包的权限转授出去。这不是“传播失控”,而是传播根本没被允许——就像你借了别人一把钥匙,但对方没给你复制权,你就没法把复制品交给第三人。
WITH GRANT OPTION 必须在每一级依赖对象上显式授予
视图权限能否成功转授,取决于它所引用的所有对象是否都带 WITH GRANT OPTION。哪怕只漏一级,GRANT SELECT ON v_to_b TO c 就会失败。
- 如果视图
v_to_b引用了a.t1和c.t2,那么必须确保:GRANT SELECT ON a.t1 TO b WITH GRANT OPTION且GRANT SELECT ON c.t2 TO b WITH GRANT OPTION - 如果视图还嵌套了另一个视图
d.v3,那还得追加:GRANT SELECT ON d.v3 TO b WITH GRANT OPTION - 注意:
WITH GRANT OPTION不自动向下穿透——它只作用于被直接授权的那个对象,不覆盖其依赖项
权限回收不会级联,但残留风险真实存在
执行 REVOKE SELECT ON a.t1 FROM b 后,b 失去对 a.t1 的访问权,但之前用它创建的视图 v_to_b 仍存在;更关键的是,b 已经转授给 c 的 SELECT ON v_to_b 并不会自动失效。此时 c 查询视图会直接报 ORA-00942 或 ORA-01031,因为底层对象已不可见。
- 没有机制能自动追踪和清理“被间接依赖的已撤销权限”
- 若需强管控,得手动查
DBA_TAB_PRIVS和DBA_DEPENDENCIES,定位哪些视图/包依赖已撤权对象 -
WITH GRANT OPTION授出后,被授权者可随时再授——只要他还没被REVOKE,就始终保有这个能力
替代方案:用角色(ROLE)+ WITH ADMIN OPTION 更可控
相比逐个对象加 WITH GRANT OPTION,用角色封装权限再授权,能降低误操作概率,也便于批量回收。
- 建角色:
CREATE ROLE hr_reader - 授对象权限(带选项):
GRANT SELECT ON hr.employees TO hr_reader WITH GRANT OPTION - 授角色(带管理权):
GRANT hr_reader TO app_user WITH ADMIN OPTION - 这样
app_user可以把整个hr_reader角色再授给他人,但不能拆开只授其中某张表——边界更清晰 - 回收时只需
REVOKE hr_reader FROM app_user,所有下游继承立即失效(角色本身不带WITH GRANT OPTION的传播性)
真正容易被忽略的点是:权限链里任意一环缺失 WITH GRANT OPTION,错误就发生在最终 GRANT 那一刻,而不是运行时;而一旦授出,就没有“自动熔断”机制——得靠人盯数据字典,或提前用角色划清责任边界。


















