授RESOURCE角色后仍无法建表,根本原因是表空间配额(QUOTA)未设置,而非缺少CREATE TABLE权限;ORA-01950错误表明用户在目标表空间(如USERS)上无任何存储配额,即使拥有RESOURCE角色且默认表空间为USERS,也需显式授予QUOTA或UNLIMITED TABLESPACE权限。
授了 resource 角色却建不了表,八成是表空间配额(quota)没设,不是权限漏了,而是写入许可卡在了表空间这一层。
ORA-01950 报错直接指向 QUOTA 缺失
错误信息 ORA-01950: no privileges on tablespace 'USERS' 看似说“没权限”,实际和系统权限(如 CREATE TABLE)完全无关。它只说明:当前用户在目标表空间(这里是 USERS)上没有分配任何存储配额。
哪怕 RESOURCE 角色已包含 CREATE TABLE 权限,哪怕用户指定了 DEFAULT TABLESPACE users,只要没配额,CREATE TABLE 就会立刻失败。
常见表现:
- 用户能
CONNECT,能查dba_sys_privs确认有CREATE TABLE,但一建表就报ORA-01950 -
SELECT * FROM dba_ts_quotas WHERE username = 'YOUR_USER';查不到任何记录 —— 这代表零配额,不是“配得少”,是“根本没给” - 用
CREATE TABLE t1 (id NUMBER) TABLESPACE users;显式指定表空间,照样报错
RESOURCE 角色是否自带 UNLIMITED TABLESPACE?别信旧文档
Oracle 12c 及以后版本中,RESOURCE 角色**不再隐含授予 UNLIMITED TABLESPACE 系统权限**。这是关键变化,很多老教程/博客仍沿用 11g 以前的逻辑,导致误判。
验证方式(用 DBA 账户执行):
SELECT privilege FROM dba_sys_privs WHERE grantee = 'YOUR_USER' AND privilege = 'UNLIMITED TABLESPACE';
如果结果为空,说明该用户没这个权限 —— 即便你刚 GRANT RESOURCE TO your_user; 过。
所以不能靠“RESOURCE 就等于能随便写”,必须显式处理配额:
- 给固定额度:
ALTER USER your_user QUOTA 100M ON users; - 给无限额度(慎用):
GRANT UNLIMITED TABLESPACE TO your_user;—— 注意:这权限不能通过角色间接授予,必须直授用户 - 建用户时一并指定:
CREATE USER u1 IDENTIFIED BY p1 DEFAULT TABLESPACE users QUOTA 50M ON users;
检查配额的三步定位法
遇到 ORA-01950,按顺序查这三项,缺一不可:
- 确认建表语句实际落到哪个表空间:
SELECT property_value FROM database_properties WHERE property_name = 'DEFAULT_PERMANENT_TABLESPACE';,再比对用户自己的DEFAULT TABLESPACE - 查该用户在对应表空间的配额:
SELECT tablespace_name, bytes/1024/1024 AS mb FROM dba_ts_quotas WHERE username = 'YOUR_USER' AND tablespace_name = 'USERS';——bytes为 0 或无返回都算失效 - 确认用户确实拥有
CREATE TABLE权限:SELECT privilege FROM dba_sys_privs WHERE grantee IN ('YOUR_USER', 'RESOURCE') AND privilege = 'CREATE TABLE';—— 如果RESOURCE行不存在,说明你的 Oracle 版本或安装精简掉了该权限,需单独补授
真正容易被忽略的点是:配额是按表空间粒度控制的,不是按用户全局生效的。哪怕你在 USERS 上配了 100M,在 EXAMPLE 上没配,建表时若指定 TABLESPACE EXAMPLE,照样报 ORA-01950。别只盯着默认表空间看。


















