ora-01950错误本质是用户在目标表空间无配额(quota),而非权限缺失;新建用户默认max_bytes=0,需用dba账号执行alter user ... quota unlimited on 表空间显式授权,且配额按“用户名+表空间名”精确绑定。

Oracle 新建用户建表时报 ORA-01950: no privileges on tablespace,不是权限没给全,而是该用户在目标表空间压根没配额——哪怕表空间本身空闲几十 GB,只要没显式分配,就直接拦在物理段分配环节。
新建用户默认没有表空间配额
CREATE USER 语句本身不自动赋予任何表空间配额,max_bytes = 0 是默认状态。这意味着用户能登录、能查数据、甚至能执行 CREATE TABLE 语法,但只要一触发段创建(比如插入第一行、建索引),就会因无法分配 extent 而失败。
- 查证方式:
SELECT tablespace_name, max_bytes FROM dba_ts_quotas WHERE username = 'NEWUSER';—— 返回空行或max_bytes = 0即确认问题 - 即使你已用
GRANT CONNECT, RESOURCE TO NEWUSER;,也完全不影响配额缺失的事实 - 别指望
DEFAULT TABLESPACE自带配额;它只是“没指定 TABLESPACE 时往哪写”,不是“允许写”
建表时实际用的是哪个表空间?
错误信息里写的表空间名(如 'USERS'、'K3CLOUD_DATA')就是真实目标,不一定等于用户的 DEFAULT TABLESPACE。它可能来自:
- 显式指定:
CREATE TABLE t1 (...) TABLESPACE K3CLOUD_DATA; - 隐式继承:用户
DEFAULT TABLESPACE是USERS,但建表语句没写TABLESPACE,就走这个 - 跨用户场景:USER1 的表上,USER2 创建索引并指定
TABLESPACE TBS1→ 报错是 USER2 在TBS1没配额,和 USER1 无关 - 迁移工具硬编码:Data Pump 的
REMAP_TABLESPACE或应用配置里写了固定表空间名
怎么快速修复?必须用 DBA 账号执行
普通用户无法给自己或其他人授配额,必须用 SYS 或 SYSTEM 登录后操作:
- 给无限配额(最常用):
ALTER USER NEWUSER QUOTA UNLIMITED ON USERS;——dba_ts_quotas中max_bytes变为-1 - 给固定额度:
ALTER USER NEWUSER QUOTA 500M ON USERS;—— 单位必须紧贴数字,不能有空格;大小写不敏感 - 撤销配额(慎用):
ALTER USER NEWUSER QUOTA 0 ON USERS;—— 这会从dba_ts_quotas中删掉该记录,等同于禁用 - 绝对不要用
GRANT UNLIMITED TABLESPACE TO NEWUSER;—— 它绕过所有表空间级控制,允许往SYSTEM、SYSAUX写数据,生产环境审计通不过
最容易被忽略的点
配额是「用户名 + 表空间名」的组合键,不是全局属性。一个用户在 USERS 有配额,不代表在 DATA01 也有;USER2 建索引用到 TBS1,就得单独给 USER2 授 TBS1 的配额。查 dba_ts_quotas 时,务必带上 AND tablespace_name = 'XXX' 精确过滤,别只查用户名就以为万事大吉。











