ORA-01950源于表空间配额缺失而非权限不足,需通过ALTER USER QUOTA或CREATE USER时指定QUOTA为用户在对应表空间分配写入额度,否则即使拥有CREATE TABLE权限也会失败。
ORA-01950不是权限问题,是配额缺失
用户执行 create table 报 ora-01950: no privileges on tablespace 'users',根本原因不是没授 create table 权限,而是该用户在 users 表空间没被分配写入额度。哪怕已 grant connect, resource to scott,只要 dba_ts_quotas 里查不到对应记录,或 max_bytes 是 0 或 null,就必然失败。
常见误操作包括:
- 以为
ALTER USER scott DEFAULT TABLESPACE users自动开通写入权限 —— 它只影响“不写TABLESPACE子句时往哪放”,不等于给配额 - 以为
GRANT UNLIMITED TABLESPACE TO scott是细粒度控制 —— 实际上它会绕过所有表空间级配额检查,且在多租户环境(CDB/PDB)中不自动继承 - 对临时表空间(如
TEMP)执行ALTER USER ... QUOTA—— 语法直接报ORA-02156: invalid temporary tablespace,QUOTA 对临时段无效
用 ALTER USER QUOTA 修改配额的三种典型场景
QUOTA 是硬性上限,不是建议值;超了就拦住 DDL/DML(如 INSERT、CREATE INDEX),报 ORA-01536。
-
ALTER USER app_user QUOTA 200M ON app_data:严格限制为 200MB,写满即停 -
ALTER USER app_user QUOTA UNLIMITED ON idx_tbs:仅对idx_tbs放开,其他表空间仍需单独配额 -
ALTER USER app_user QUOTA 0 ON system:显式禁止写入SYSTEM,哪怕有DBA角色也不行(注意:这不影响读,也不删已有对象)
执行后务必验证:SELECT tablespace_name, max_bytes FROM DBA_TS_QUOTAS WHERE USERNAME = 'APP_USER'。若无返回,说明语句没在目标 PDB 内执行,或用户名拼写错误。
建用户时直接带 QUOTA 最稳妥,避免“建完不能用”
事后补 ALTER USER 容易遗漏,尤其当应用启动脚本紧随用户创建之后执行时,极易触发 ORA-01950。Oracle 12c 支持在 CREATE USER 中直接声明多个 QUOTA,语法合法且推荐:
CREATE USER app_user IDENTIFIED BY pwd DEFAULT TABLESPACE app_data TEMPORARY TABLESPACE temp QUOTA 200M ON app_data QUOTA 50M ON idx_tbs QUOTA 0 ON system;
这样定义后:
- 用户默认往
app_data写,最多 200MB - 可显式指定
TABLESPACE idx_tbs建索引,但不能超 50MB - 哪怕有
CREATE TABLE权限,也无法在SYSTEM里建任何段
配额监控和生产环境注意事项
真正需要长期运行的应用账号,应设合理上限而非依赖 UNLIMITED。配额变更不会立即生效于当前会话(尤其跨 PDB 场景),需重新连接或确认容器上下文:SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL。
关键细节容易被忽略:
-
QUOTA对撤销表空间(UNDOTBS1)也无效,语法不报错但实际不生效 -
GRANT UNLIMITED TABLESPACE一旦授予,DBA_TS_QUOTAS里将查不到该用户的配额记录(因为配额机制被整体跳过) - 如果建表语句显式写了
TABLESPACE example,那必须给example而非默认表空间加配额











