ora-01950报错本质是用户在指定表空间无配额,而非缺乏create table等权限;需用alter user quota显式分配空间额度,配额与权限机制相互独立。

ORA-01950报错本质是没配额,不是缺权限
遇到 ORA-01950: no privileges on tablespace 'USERS',别急着加 CREATE TABLE 权限。这是 Oracle 在告诉你:用户有建表能力,但没被允许往这个表空间里写数据。配额(QUOTA)和权限是两套机制——前者管“能存多少”,后者管“能不能操作”。即使给了 CONNECT、RESOURCE 甚至 DBA 角色,没配额照样建表失败。
用 ALTER USER QUOTA 设置具体大小
给已有用户分配固定额度,必须显式执行 ALTER USER。常见错误是以为创建用户时设了默认表空间,配额就自动生效——不会。
-
ALTER USER scott QUOTA 100M ON users;:允许在users表空间最多占 100MB(注意表空间名大小写敏感,取决于创建时是否加引号) -
ALTER USER scott QUOTA 0 ON system;:禁止在system表空间建任何段,哪怕有CREATE TABLE权限 - 如果用户已有对象占用了空间,新设的 100M 配额会立即生效;超限时插入或建表直接报
ORA-01536 - 不能对临时表空间(如
TEMP)设配额,否则报ORA-02156
UNLIMITED QUOTA 和 UNLIMITED TABLESPACE 的区别与风险
两者效果一样:绕过所有配额检查。但授权路径不同,撤销方式也不同,混用容易失控。
-
ALTER USER scott QUOTA UNLIMITED ON users;:只放开users表空间,其他表空间仍受控 -
GRANT UNLIMITED TABLESPACE TO scott;:全局豁免,所有表空间都失效配额,且DBA_TS_QUOTAS里查不到该用户记录 - 撤销时必须对应:
REVOKE UNLIMITED TABLESPACE FROM scott;才能恢复配额机制;用ALTER USER ... QUOTA 0对已授UNLIMITED TABLESPACE的用户无效 - 生产环境应避免
UNLIMITED TABLESPACE,它无法做精细化资源隔离
查配额和实际用量,不能只看 DBA_TS_QUOTAS
DBA_TS_QUOTAS 只显示显式设置的配额值(包括 UNLIMITED),不反映真实占用。要判断是否快超限,得联合查实际段大小。
- 查配额定义:
SELECT username, tablespace_name, max_bytes/1024/1024 MB FROM DBA_TS_QUOTAS WHERE username = 'SCOTT';(max_bytes = -1表示UNLIMITED) - 查真实占用:
SELECT tablespace_name, SUM(bytes)/1024/1024 MB FROM DBA_SEGMENTS WHERE owner = 'SCOTT' GROUP BY tablespace_name; - 注意:
CREATE TABLE AS SELECT、分区交换等操作也会计入配额,但不触发 DDL 审计日志,需靠定期扫描发现 -
QUOTA不约束临时段、回滚段、LOB 存储子句——这些走的是TEMP或UNDOTBS1,和配额无关
DBA_SEGMENTS 和 DBA_TS_QUOTAS 才能真正盯住。











