必须同时授予create view、select any table和select any dictionary三权,因视图创建时需校验select语句合法性:create view仅允许语法执行,select any table支持跨schema查询,select any dictionary支撑访问v$等数据字典视图。

普通用户执行 CREATE VIEW 报错 ORA-01031: insufficient privileges,光给 CREATE VIEW 权限是不够的——必须同时满足三个条件。
为什么只 grant create view 不行?
Oracle 视图本质是封装一条 SELECT 语句,创建时数据库要校验该语句能否合法执行。所以除了“能建视图”这个动作权限,还必须有“能查到被引用对象”的能力。
-
CREATE VIEW:允许执行CREATE VIEW ... AS SELECT ...语法 -
SELECT ANY TABLE:让视图能跨 schema 查询其他用户的表(比如SELECT * FROM scott.emp) -
SELECT ANY DICTIONARY:部分视图会隐式访问数据字典(如V$SESSION、DBA_TABLES),没这权限也会报错
三者缺一不可。仅授 CREATE VIEW,建基于自己表的简单视图可能成功;但只要涉及其他 schema 或字典视图,立刻失败。
scott 用户想建视图,怎么授权?
用 SYSTEM 或 SYS 登录后执行:
GRANT CREATE VIEW TO scott; GRANT SELECT ANY TABLE TO scott; GRANT SELECT ANY DICTIONARY TO scott;
注意:SELECT ANY TABLE 是高危权限,生产环境慎用。如果视图只查特定几张表,应改用对象级授权:
GRANT SELECT ON hr.employees TO scott; GRANT SELECT ON hr.departments TO scott;
再配合 CREATE VIEW 即可,无需开放全局查询权。
新建用户(如 app_user)需要哪些最小权限?
按最小权限原则,避免直接授 SELECT ANY TABLE:
- 先确保能连库:
GRANT CREATE SESSION TO app_user; - 再授建视图权:
GRANT CREATE VIEW TO app_user; - 最后按需授具体对象查询权:
GRANT SELECT ON owner.table_name TO app_user;
如果视图定义里用了同义词或 DBA 视图(如 DBA_USERS),才额外考虑 SELECT ANY DICTIONARY,且务必评估安全影响。
建完视图却查不了?检查 owner 和权限链
常见现象:CREATE VIEW v_emp AS SELECT * FROM emp; 成功,但 SELECT * FROM v_emp; 报 ORA-00942: table or view does not exist。
原因通常是:
- 视图中引用的表(如
emp)没加 schema 前缀,而当前用户下没有该表 → 应写成scott.emp - 被引用对象的 owner 没授予
SELECT权限给你,或没加WITH GRANT OPTION→ 视图无法“传递”权限 - 你用的是同义词但没权限访问原对象 → 同义词只是别名,不改变底层权限校验
最稳妥的做法:所有跨 schema 引用都显式写全 schema.object_name,并确认每个对象都已单独授权。











