ORA-01950错误源于用户在目标表空间无配额,即使有CREATE TABLE权限也无法建表;需DBA执行ALTER USER ... QUOTA ... ON tablespace授予配额,或谨慎使用UNLIMITED TABLESPACE权限。
ORA-01950:no privileges on tablespace 错误怎么修
用户执行 create table 报这个错,不是权限没给全,而是表空间配额(quota)根本没设,哪怕有 create table 权限也白搭。oracle 默认不给任何表空间的写入额度,必须显式授权。
- 检查当前用户在目标表空间的配额:
SELECT tablespace_name, bytes/1024/1024 AS mb FROM dba_ts_quotas WHERE username = 'YOUR_USER'; - 若查不到记录,说明完全没配额;若
bytes为 0,等同于禁止写入 - 授予配额必须由 DBA 执行:
ALTER USER your_user QUOTA 100M ON users;(users是常见默认表空间名,按实际替换) - 想不限制大小?用
UNLIMITED TABLESPACE系统权限,但慎用——它绕过所有表空间配额控制,安全策略上通常被禁用
RESOURCE 角色到底给不给 CREATE TABLE 权限
RESOURCE 角色本身不包含 CREATE TABLE,它只带 CREATE CLUSTER、CREATE SEQUENCE 等一堆“资源类”对象权限,建表权限得靠 CREATE TABLE 单独授,或通过 CONNECT + 显式配额组合实现。
- 验证方法:
SELECT privilege FROM dba_sys_privs WHERE grantee = 'RESOURCE' AND privilege LIKE '%TABLE%';—— 结果为空 - 常见误解:以为加了
RESOURCE就能建表,其实只是凑够了“能建序列+能建触发器”这类配套权限,主权限还得另加 - 生产环境建议拆开授权:先给
CREATE TABLE,再按需配QUOTA,避免把RESOURCE当万能钥匙乱授
用 DEFAULT TABLESPACE 但没配 QUOTA 依然失败
即使用户指定了 DEFAULT TABLESPACE users,且建表语句没写 TABLESPACE 子句,Oracle 仍会检查该表空间上的配额。没配 ≠ 自动允许。
- 查用户默认表空间:
SELECT default_tablespace FROM dba_users WHERE username = 'YOUR_USER'; - 配额必须作用于这个表空间名,不能写错大小写(如
USERS和users在区分大小写的数据库里是不同值) - 如果数据库启用了本地管理表空间(LMT),配额单位是字节,不是 extent 数量,别按老习惯估算
- 临时表空间(
TEMPORARY TABLESPACE)不影响建表,别在这儿浪费排查时间
DBA 授权时容易漏掉的两个细节
给开发账号开通建表能力,常卡在两个隐形环节:角色未激活、配额未生效。
-
RESOURCE角色默认是启用的,但如果用户被ALTER USER ... DEFAULT ROLE NONE;过,就得显式SET ROLE resource;,否则权限不生效 - 配额修改后无需重启实例,但某些旧版 Oracle(如 11g R1)在极少数情况下需重新连接才能识别新配额,可让应用重连测试
- 如果用户属于多个角色(比如同时有
RESOURCE和自定义角色),注意角色间权限冲突不会报错,但缺失的配额仍是硬门槛
RESOURCE 不是银弹,别指望它自动补全所有权限。










