应使用 QUOTA 限制用户存储配额而非 UNLIMITED TABLESPACE;如限 scott 在 USERS 表空间用 100MB,执行 ALTER USER scott QUOTA 100M ON users;配额仅约束永久段,不生效于 TEMP 或 UNDOTBS1。
GRANT UNLIMITED TABLESPACE 权限太宽?用 QUOTA 精确控存储更安全
直接给用户 unlimited tablespace 权限等于放任自流,容易撑爆表空间。真要限制某用户只能在 users 表空间里存 100mb 数据,得靠 alter user ... quota,不是 grant。
-
QUOTA是用户级配额,绑定到具体表空间,和角色权限无关 - 必须先确保用户已存在,且目标表空间(如
USERS)处于ONLINE状态 - 配额为
0表示禁止在此表空间创建段;UNLIMITED才是真正不限制,不是省略或写NULL - 如果用户已有对象占用了空间,新设的
100M配额会立即生效——超限的 INSERT/CREATE 会报ORA-01536: space quota exceeded for tablespace 'USERS'
执行 ALTER USER ... QUOTA 的典型命令和常见报错
语法很简单,但错一个词就失败。最常卡在权限不足或表空间名拼错。
- 正确写法:
ALTER USER scott QUOTA 100M ON users;(注意表空间名大小写敏感,取决于创建时是否加引号) - 如果报
ORA-01950: no privileges on tablespace 'USERS',说明执行者没被授予ALTER USER权限,或不是 DBA - 如果表空间名写成
USER或user_tablespace,会报ORA-00959: tablespace does not exist - 不能对临时表空间(
TEMP)设QUOTA,否则报ORA-02156: invalid TEMPORARY tablespace
配额生效范围:只管「段」,不管「临时段」和「回滚段」
QUOTA 只约束用户在该表空间中创建的永久段(比如表、索引、LOB),其他类型不在此列。
- 排序操作用的临时段走的是
TEMP表空间,不受此配额影响 - 事务产生的回滚信息默认在
UNDOTBS1,也不计入QUOTA - 如果用户建了分区表,每个分区都算在配额内;但物化视图日志、审计表等系统对象,一般属于
SYS用户,不占用普通用户配额 - 配额检查发生在 DML/DDL 执行时(比如
INSERT触发扩展数据段),不是按天/小时刷新,也没有延迟生效机制
查配额、调配额、清配额:三个关键查询和操作
配额设完不是一劳永逸,得能查、能调、必要时还能清。
- 查当前配额:
SELECT username, tablespace_name, bytes/1024/1024 mb_used, max_bytes/1024/1024 mb_quota FROM dba_ts_quotas WHERE username = 'SCOTT'; - 调高到 200M:
ALTER USER scott QUOTA 200M ON users;(可反复执行,覆盖旧值) - 彻底取消配额(即恢复为 0):
ALTER USER scott QUOTA 0 ON users;,不是DROP也不是REVOKE - 注意:
dba_ts_quotas视图只显示有非零配额的记录;如果查不到,说明配额为 0 或未设置
SYSTEM 表空间(虽然不推荐),那 QUOTA ON USERS 就完全不起作用。真要控住,得盯紧 DEFAULT TABLESPACE 和建表时显式指定的 TABLESPACE。










