ora-01950报错本质是用户在目标表空间无有效配额,需先查dba_ts_quotas确认max_bytes是否为-1(unlimited)、正值或空行/0,再针对性执行alter user quota授权,而非盲目授予unlimited tablespace。
ora-01950 报错时,直接重授 unlimited tablespace 权限往往治标不治本,甚至引入安全风险;真正该先查的是配额是否已写入 dba_ts_quotas,以及用户是否因撤销 resource 或 dba 角色而意外丢失隐式权限。
查配额记录是否存在,而不是只看错误现象
报 ORA-01950 不代表表空间没空间,只说明当前用户在目标表空间(比如 USERS)没有有效配额。别急着 GRANT UNLIMITED TABLESPACE,先确认配额状态:
-
SELECT tablespace_name, max_bytes FROM dba_ts_quotas WHERE username = 'MCDBA_BAK'—— 若返回空行,说明从未设置过配额,或ALTER USER ... QUOTA语句根本没执行成功(注意用户名大小写、拼写) -
max_bytes = 0表示显式禁用,等同于“不准用这个表空间” -
max_bytes = -1才是真正生效的 unlimited 配额;若为正数(如10737418240),说明限制了 10G,但可能已被耗尽 - 务必确认报错时实际使用的表空间名:应用建表时若没指定
TABLESPACE,会走用户默认表空间;查DBA_USERS.default_tablespace可验证
撤销 RESOURCE/DBA 后配额“消失”的真实原因
很多用户发现:刚建好用户并赋了 RESOURCE,能正常建表;但后来回收了 RESOURCE,再执行 DDL 就报 ORA-01950 —— 这不是配额被删了,而是 UNLIMITED TABLESPACE 系统权限被连带收回了。
-
RESOURCE角色本身不包含UNLIMITED TABLESPACE,但它在授予用户时,Oracle 会**隐式附加**该权限(这是 Oracle 的行为,非文档承诺) - 一旦
REVOKE RESOURCE FROM user,这个隐式权限就没了,且不会留下任何配额记录(DBA_TS_QUOTAS仍为空) - 此时
GRANT UNLIMITED TABLESPACE TO user能恢复功能,但它是全局权限,允许用户往SYSTEM、SYSAUX写对象,生产环境严禁使用 - 更安全的做法是:明确指定表空间配额,例如
ALTER USER MCDBA_BAK QUOTA UNLIMITED ON USERS
QUOTA 和 UNLIMITED TABLESPACE 权限的优先级与冲突
两者不是互斥关系,但有明确覆盖逻辑:只要用户拥有 UNLIMITED TABLESPACE,所有单个表空间的 QUOTA 设置都失效(包括设为 0)。
- 查用户是否拥有该系统权限:
SELECT privilege FROM dba_sys_privs WHERE grantee = 'MCDBA_BAK' AND privilege = 'UNLIMITED TABLESPACE' - 若存在,且你只想放开某一个表空间,必须先
REVOKE UNLIMITED TABLESPACE FROM MCDBA_BAK,再用ALTER USER ... QUOTA单独授权 -
USER_TS_QUOTAS视图可能显示max_bytes = 0,但用户仍能建表——这恰恰说明他有UNLIMITED TABLESPACE,视图不展示被覆盖的配额 - 切记:不要给普通用户设
SYSTEM或SYSAUX的QUOTA,这两个表空间只应由SYS/SYSTEM使用
临时表空间和还原表空间不需要配额
报错若出现在创建索引、排序或闪回操作中,别在 TEMP 或 UNDOTBS1 上折腾 QUOTA —— 这些表空间天生不支持配额,设了也无效。
- 检查当前用户的临时表空间:
SELECT temporary_tablespace FROM dba_users WHERE username = 'MCDBA_BAK' - 确认临时表空间是否有足够空间:
SELECT tablespace_name, bytes_used, bytes_free FROM v$temp_space_header - 如果问题出在临时段,
ORA-01950是误导性错误,真实原因是临时表空间满或参数sort_area_size设置不当
最常被忽略的一点:配额变更后,无需重启会话或刷新缓存,但必须确保执行 ALTER USER 的是具备 DBA 权限的用户,并且语句已成功提交;哪怕只少打了一个分号,DBA_TS_QUOTAS 里也不会多出一行记录。











