DBA_TS_QUOTAS查不到用户记录表示该用户在对应表空间无配额(即QUOTA 0),而非无限制;必须用ALTER USER...QUOTA显式设置,未设置则禁止写入。

直接给结论:必须用 ALTER USER ... QUOTA 显式设置,不设等于不限制,查不到配额记录就等同于 QUOTA 0 ON tablespace_name。
为什么 DBA_TS_QUOTAS 查不到用户记录?
查不到不是“没限制”,而是 Oracle 默认按无配额处理(即禁止写入)。DBA_TS_QUOTAS 只存你手动执行过 ALTER USER ... QUOTA 的记录;没设过,就不出现——这恰恰意味着该用户在那个表空间里建不了任何段。
- 若查询返回空,且你希望用户能用空间,请立刻执行类似
ALTER USER scott QUOTA 100M ON users; -
MAX_BYTES = -1表示UNLIMITED,不是 1 字节;MAX_BYTES = 0才是彻底禁用 - 别依赖
DBA_USERS.DEFAULT_TABLESPACE判断配额,它和配额无关
ALTER USER ... QUOTA 的正确写法和常见报错
语法简单但容错低,错一个词就失败。核心是权限、表空间名、单位三者都得对。
- 正确示例:
ALTER USER app_user QUOTA 200M ON app_data;(注意表空间名大小写敏感,取决于创建时是否加引号) - 报
ORA-01950: no privileges on tablespace 'USERS'→ 执行者缺少ALTER USER权限或不是 DBA - 报
ORA-00959: tablespace does not exist→ 表空间名拼错,比如写成user或USER_TABLESPACE - 对临时表空间执行会报
ORA-02156: invalid TEMPORARY tablespace,QUOTA 只作用于永久表空间
配额生效范围与容易忽略的细节
QUOTA 控的是「永久段」,不是所有空间操作。很多看似无关的行为其实也吃配额。
- 回收站对象(
bin$xxx)计入用户配额,DROP TABLE后不PURGE RECYCLEBIN,可能悄摸占掉 20%+ 配额 - 分区表每个分区都算在配额内;
CREATE TABLE AS SELECT或分区交换间接占用的空间也计入 - 设
QUOTA 0 ON users不会删已有数据,但后续 INSERT 若触发新 extent 分配,仍报ORA-01536 - 已占空间不会因调低配额而自动释放,DBA 需手动
TRUNCATE或DROP对象
真正麻烦的点不在设置,而在监控和清理:配额检查是实时的,但配额占用增长却可能藏在回收站、分区、CTAS 里,不跑 DBA_SEGMENTS 和 USER_RECYCLEBIN 查询根本发现不了。











