普通用户默认无表空间权限,因缺少UNLIMITED TABLESPACE及配额,查DBA_TABLESPACES报ORA-00942,USER_TABLESPACES为空;应查USER_USERS、USER_TS_QUOTAS和SESSION_ROLES确认现状。
普通用户为什么连表空间都“看不见”
oracle普通用户默认没有 unlimited tablespace 权限,也不被授予任何具体表空间的配额(quota),这时执行 select * from dba_tablespaces 会直接报 ora-00942: table or view does not exist;哪怕查 user_tablespaces 也只返回空集——不是表空间消失了,而是权限拦住了元数据访问路径。
确认当前用户到底有没有表空间权限
别急着找DBA要权限,先自己查清楚现状。普通用户能安全执行的检查语句只有这几个:
-
SELECT * FROM USER_USERS;—— 看DEFAULT_TABLESPACE和TEMPORARY_TABLESPACE字段,这是你被创建时分配的默认空间,但不等于你能在里面建对象 -
SELECT * FROM USER_TS_QUOTAS;—— 关键!如果结果为空,说明你在所有表空间上都没有配额,哪怕有UNLIMITED TABLESPACE也得靠这条验证 -
SELECT * FROM SESSION_ROLES;—— 检查是否意外拥有了DBA或RESOURCE角色(后者常隐含UNLIMITED TABLESPACE)
注意:DBA_* 视图一律不可查,强行用会触发权限错误,不是数据库坏了。
UNLIMITED TABLESPACE 到底管什么、不管什么
这个系统权限是个“开关”,但它只控制「能否在任意表空间上无上限地分配空间」,不解决以下问题:
- 不赋予你查询
DBA_TABLESPACES的权利(那是SELECT_CATALOG_ROLE或DBA的事) - 不自动给你在某个表空间建表的权限(
CREATE TABLE是单独的对象权限) - 不绕过表空间本身的
OFFLINE或READ ONLY状态限制 - 如果你的默认表空间是
SYSTEM或SYSAUX,即使有UNLIMITED TABLESPACE,DBA 通常也会显式禁止用户在其中建对象
典型误操作:给用户授了 UNLIMITED TABLESPACE,但忘了设 quota 或没开 CREATE TABLE,结果还是 ORA-01950: no privileges on tablespace 'USERS'。
真正让普通用户能建表的最小权限组合
光有 UNLIMITED TABLESPACE 不够,至少补全这三项:
- 对象权限:
GRANT CREATE TABLE TO username; - 空间配额:
ALTER USER username QUOTA UNLIMITED ON users;(或指定具体表空间名,如data01) - 可选但推荐:
GRANT CREATE SESSION TO username;(否则连登录都失败,容易被忽略)
如果 DBA 坚持不给 unlimited quota,可用有限配额替代:ALTER USER username QUOTA 10M ON users;。注意:配额必须显式设置,不会继承自角色或系统权限。
权限生效无需重启会话,但已打开的事务/游标不受影响;新会话里立刻可用。











