ALTER USER设置配额是限制用户表空间使用量的唯一有效方式:QUOTA 0 ON tablespace_name禁止写入,QUOTA UNLIMITED ON放开限制,QUOTA nM设具体上限;未在DBA_TS_QUOTAS中查到记录即等同于无配额(默认禁止),且配额仅对永久表空间生效。
如何用 ALTER USER 设置或取消表空间配额
oracle 中限制用户对某个表空间的使用量,核心就是通过 alter user 语句设置 quota。不设配额(即 quota unlimited on tablespace_name)等于放行,设为 0(quota 0 on tablespace_name)才真正禁止其在该表空间创建段。
常见错误是以为 REVOKE UNLIMITED TABLESPACE 就能限制配额——其实它只影响默认的 unlimited 权限,不改变已显式授予的配额,也不影响新创建对象所需的 quota。
-
ALTER USER scott QUOTA 5M ON users;—— 允许最多使用 5MB -
ALTER USER scott QUOTA 0 ON users;—— 禁止在users表空间建任何段(如表、索引),即使有CREATE TABLE权限也会报ORA-01536: space quota exceeded for tablespace 'USERS' -
ALTER USER scott QUOTA UNLIMITED ON users;—— 撤销配额限制(注意:不是“恢复默认”,而是显式放开)
为什么 SELECT * FROM DBA_TS_QUOTAS 查不到用户配额?
查不到记录通常意味着该用户在对应表空间上**没有显式设置过配额**,此时 Oracle 默认按“无配额”处理(等价于 0),而非继承某个全局策略。
也就是说:DBA_TS_QUOTAS 是个“显式配置表”,只存你手动执行过 ALTER USER ... QUOTA ... 的记录;没设过,就不出现——但这不代表用户能用空间,恰恰相反,没设 = 不允许用。
- 确认用户当前配额状态,必须查
DBA_TS_QUOTAS,而不是依赖DBA_USERS的DEFAULT_TABLESPACE - 若查询返回空,且你希望用户可用空间,请显式赋予非零配额,例如
QUOTA 10M ON users - 若用户已存在对象(比如以前有配额并建了表),设为
QUOTA 0不会删数据,但后续 DML 若触发空间扩展(如插入导致新 extent 分配),仍可能报错
QUOTA 对临时表空间和撤销表空间是否生效?
完全不生效。QUOTA 只作用于**永久性数据表空间**(PERMANENT tablespace),对 TEMPORARY 或 UNDO 类型表空间无效。
临时段(如排序、全局临时表)走的是临时表空间,由 TEMPORARY TABLESPACE 属性控制,配额设置会被忽略;撤销段由系统自动管理,也不受 QUOTA 约束。
- 限制用户临时空间用量,应通过
ALTER USER ... TEMPORARY TABLESPACE ts_name指向一个资源受限的临时表空间,并配合RESOURCE_LIMIT和SESSIONS_PER_USER等 profile 限制 - 撤销空间由
UNDO_RETENTION和UNDO_TABLESPACE控制,与用户配额无关 - 误在 undo 表空间上执行
QUOTA语句不会报错,但DBA_TS_QUOTAS中不会记录,也无实际效果
配额变更何时生效?是否需要重连?
立即生效,无需用户重连,也无需重启实例或刷新共享池。
但要注意:如果用户当前会话中已有未提交事务、正在使用的临时段、或缓存的区分配信息,某些操作(如大批量 INSERT)可能短暂绕过新配额检查,直到下次空间申请时才触发校验。这不是 bug,而是 Oracle 空间管理的延迟校验机制。
- 新配额对后续所有 DDL/DML 生效,包括
CREATE TABLE、INSERT /*+ APPEND */、ALTER TABLE ... MOVE - 已存在的对象不受影响,但
ALTER TABLE ... ALLOCATE EXTENT这类显式扩展会受新配额约束 - 若用户正执行大事务并占用大量空间,突然设为
QUOTA 0,事务提交前不会失败;但下次尝试写入新块时才会报错
配额是个细粒度但容易被低估的控制点——它不阻断权限,只卡空间入口;而它的“静默失效”特性(查不到记录 ≠ 可用空间)是最常被忽略的实际行为。


















