RESOURCE角色不包含CREATE VIEW权限,仅含CREATE TABLE、CREATE SEQUENCE、CREATE PROCEDURE等对象创建权限;CONNECT角色在10g+中仅剩CREATE SESSION权限;需显式授予CREATE VIEW才能建视图。

因为 RESOURCE 角色不包含 CREATE VIEW 权限,这是 Oracle 从 10g 起就明确剥离的设计事实。
RESOURCE 角色到底给了什么权限?
它只提供建表、建序列、建存储过程等对象创建能力,但不包括视图:
-
CREATE TABLE、CREATE SEQUENCE、CREATE PROCEDURE等都包含 -
CREATE VIEW完全不在其中 —— 查证语句:SELECT * FROM role_sys_privs WHERE role = 'RESOURCE' - 即使你用
GRANT CONNECT, RESOURCE TO scott,scott依然不能执行CREATE VIEW
为什么 CONNECT 也不行?
10g 及以后版本中,CONNECT 已被大幅精简,只剩 CREATE SESSION:
- 9i 时它还带
CREATE VIEW、CREATE TABLE等,但那是历史遗留 - 10g+ 中查
SELECT * FROM role_sys_privs WHERE role = 'CONNECT',结果只有 1 条记录:CREATE SESSION - 所以连
CONNECT都不能解决建视图问题,更别说靠它“凑齐权限”
真正需要的授权方式
必须显式授予 CREATE VIEW(或 CREATE ANY VIEW),且注意作用域:
- 普通场景用:
GRANT CREATE VIEW TO scott—— 只能在自己 schema 下建视图 - 跨 schema 建(比如在
report下建基于scott.emp的视图):还需确保scott已GRANT SELECT ON emp TO report;否则即使有CREATE ANY VIEW,也会报ORA-00942: 表或视图不存在 -
CREATE ANY VIEW是高危权限,绕过 schema 限制但不豁免基表访问权,慎用
容易被忽略的关键点
权限不是“有了角色就万事大吉”,Oracle 的权限模型是分层叠加的:
- 系统权限(如
CREATE VIEW)和对象权限(如对某张表的SELECT)必须同时满足 - 哪怕用户有
CREATE VIEW,如果SELECT的表没加 schema 前缀(比如写成SELECT * FROM emp而非SELECT * FROM scott.emp),Oracle 默认去当前用户 schema 找,找不到就直接失败 - 视图编译阶段就校验基表可访问性,不是运行时才报错 —— 所以
CREATE OR REPLACE VIEW失败,大概率是权限或对象名问题,不是语法问题


















