ORA-01720表示视图创建者无底层对象的WITH GRANT OPTION权限,导致无法转授权;需检查依赖对象(表/同义词/物化视图)的SELECT权限是否带grantable=YES。

ORA-01720:grant option does not exist for 'xxx' 是什么信号
这个错误明确告诉你:当前用户试图把一个视图(比如 v_emp)的 SELECT 权限授予别人,但该视图所依赖的底层对象(如 hr.employees)没有被授予 WITH GRANT OPTION,导致权限链断裂。
它不是“没授权”,而是“不能转授”。常见于跨 schema 视图场景:A 用户建视图,引用了 B 用户的表;B 授了 SELECT 给 A,但没加 WITH GRANT OPTION;A 再去授视图给 C,就报 ORA-01720。
- 执行
SELECT grantable FROM dba_tab_privs WHERE owner = 'HR' AND table_name = 'EMPLOYEES' AND grantee = 'APP',返回必须是YES - 如果返回
NO或查不到记录,说明 HR 没用WITH GRANT OPTION授过权给 APP - 注意:系统权限(如
SELECT ANY TABLE)不支持WITH GRANT OPTION,只适用于对象权限
ORA-00942 vs ORA-01031:先看错号,再定路径
两个错误都表现为“查不了”,但根因完全不同,必须用目标用户账号亲自执行 SELECT * FROM view_name 来确认:
-
ORA-00942: table or view does not exist→ 底层对象根本不可见。比如视图里写了hr.employees,但目标用户没被授过hr.employees的SELECT权限,也不是hr用户本人 -
ORA-01031: insufficient privileges→ 对象存在,但缺显式权限。特别注意:Oracle 不认角色里的对象权限(比如通过CONNECT或自定义角色间接获得的SELECT),必须是直接授予的 - 别跳过这步验证——用错号反推权限缺失层级,比盲目重授快得多
视图定义里藏着同义词或物化视图怎么办
视图可能不是直接查表,而是查同义词(emp_syn)或物化视图(MATERIALIZED VIEW),这两类容易漏检:
- 查视图定义:
SELECT text FROM all_views WHERE owner = 'APP' AND view_name = 'V_EMP',人工识别出所有对象名(包括带 schema 前缀的) - 如果是同义词:
SELECT table_owner, table_name FROM all_synonyms WHERE owner = 'APP' AND synonym_name = 'EMP_SYN',然后去查table_owner.table_name是否已对目标用户授权 - 物化视图不在
all_views里,得查all_mviews;权限检查方式和普通视图一样,但创建者需有SELECT+WITH GRANT OPTION才能向下授权
批量检查依赖对象权限的最小可行命令
别靠肉眼数对象。用一条 SQL 把视图所有直接依赖的对象权限状态列出来:
SELECT d.owner, d.name, d.type, p.privilege, p.grantable
FROM all_dependencies d
LEFT JOIN dba_tab_privs p ON p.owner = d.referenced_owner
AND p.table_name = d.referenced_name
AND p.grantee = 'TARGET_USER'
WHERE d.owner = 'VIEW_OWNER'
AND d.name = 'VIEW_NAME'
AND d.type = 'VIEW'
AND d.referenced_type IN ('TABLE', 'VIEW', 'SYNONYM', 'MATERIALIZED VIEW');
重点关注 grantable 列是否全为 YES;privilege 是否为 SELECT(或 EXECUTE,若含函数);type 为 SYNONYM 的行要顺藤摸瓜再查一层。
真正卡住人的,往往不是最外层的视图授权语句,而是某张表、某个同义词、甚至某次中间授权时漏掉的 WITH GRANT OPTION —— 它不会报错,直到你试图把权限传给第三个人。











