Oracle中限制用户表空间配额必须显式执行ALTER USER QUOTA语句,未设置即默认等价于QUOTA 0,禁止写入;配额仅对永久表空间生效,且UNLIMITED TABLESPACE权限会覆盖所有配额设置。

ALTER USER QUOTA 语句必须显式执行,不设等于禁止
没在 DBA_TS_QUOTAS 里查到记录,不代表用户能用空间——恰恰相反,Oracle 默认按「无配额」处理,等价于 QUOTA 0 ON tablespace_name。只要用户没被显式赋予非零配额或 UNLIMITED,哪怕有 CREATE TABLE 权限,在目标表空间建表也会报 ORA-01950: no privileges on tablespace 'USERS'。
必须用 ALTER USER 显式设置:
-
ALTER USER scott QUOTA 10M ON users;—— 允许最多用 10MB -
ALTER USER scott QUOTA 0 ON users;—— 禁止在此表空间创建任何段(表、索引等) -
ALTER USER scott QUOTA UNLIMITED ON users;—— 解除该表空间的配额限制(注意:不是“恢复默认”,而是覆盖掉之前所有配额设置)
表空间名区分大小写,取决于创建时是否加引号;写错会报 ORA-00959: tablespace does not exist。
QUOTA 只对永久表空间生效,TEMP 和 UNDO 无效
QUOTA 的作用范围非常明确:仅约束用户在 永久性数据表空间(PERMANENT)中创建的段。临时段(排序、全局临时表)、回滚段(事务产生的 undo)完全不受影响。
常见误操作:
- 对
TEMP表空间执行QUOTA 100M ON temp→ 报ORA-02156: invalid TEMPORARY tablespace - 以为设了
QUOTA就能控住排序内存占用 → 实际走的是TEMPORARY TABLESPACE属性,得靠ALTER USER ... TEMPORARY TABLESPACE ts_name配合 profile 限 SESSIONS_PER_USER 或 SORT_AREA_SIZE - 指望
QUOTA限制 undo 使用量 → 不生效,undo 用量由UNDO_RETENTION和UNDO_TABLESPACE控制
UNLIMITED TABLESPACE 权限会让所有 QUOTA 失效
如果用户被授予了 UNLIMITED TABLESPACE 系统权限(比如属于 RESOURCE 角色,或 DBA 直接 GRANT),那么无论你给它设多少 QUOTA,全都不起作用。此时查 DBA_TS_QUOTAS 可能看到 BYTES > MAX_BYTES,这就是典型冲突信号。
真要精确控配额,必须:
- 先回收权限:
REVOKE UNLIMITED TABLESPACE FROM scott; - 再设配额:
ALTER USER scott QUOTA 50M ON users; - 注意:
DBA角色自带UNLIMITED TABLESPACE,回收 DBA 时连带收回该权限,生产环境务必谨慎
查配额不能只看 DBA_TS_QUOTAS,得结合实际占用
DBA_TS_QUOTAS 只存显式配置,不反映真实使用量。一个用户配额是 100M,但已占 95M,你却只查配额值,就容易漏掉风险。
关键组合查询:
- 配额定义:
SELECT username, tablespace_name, max_bytes/1024/1024 mb_quota FROM dba_ts_quotas WHERE username = 'SCOTT';(max_bytes = -1表示UNLIMITED) - 真实占用:
SELECT tablespace_name, SUM(bytes)/1024/1024 mb_used FROM dba_segments WHERE owner = 'SCOTT' GROUP BY tablespace_name; - 分区表、CTAS、交换分区等操作也会计入配额,但不会触发 DDL 审计,只能靠定期跑上面的
dba_segments查询发现
配额检查发生在 DML/DDL 执行瞬间(比如 INSERT 触发新 extent 分配),不是定时刷新,也没有缓冲期——超限立刻报 ORA-01536: space quota exceeded for tablespace 'USERS'。


















