Oracle 12c中限制用户在特定表空间的空间使用量,必须用ALTER USER ... QUOTA或CREATE USER时带QUOTA子句显式分配;GRANT权限或设DEFAULT TABLESPACE均无效,ORA-01950错误源于配额缺失而非权限不足。
oracle 12c里限制用户在某个表空间能用多少空间,必须用 quota 子句显式分配,靠 grant create table 或设 default tablespace 完全无效。
ORA-01950 错误不是权限问题,是配额缺失
用户执行 CREATE TABLE 报 ORA-01950: no privileges on tablespace 'USERS',常见但误导性极强——它和“能不能建表”无关,只说明该用户在 USERS 表空间没被分配写入额度。
- 即使已
GRANT CONNECT, RESOURCE TO scott,RESOURCE角色含CREATE TABLE权限,但不含任何QUOTA,1 字节都不给 -
ALTER USER scott DEFAULT TABLESPACE users只影响“不写TABLESPACE子句时往哪放”,不等于“自动开通写入闸门” - 查
DBA_TS_QUOTAS,若查不到该用户记录,或MAX_BYTES是-1,基本可断定没配额
ALTER USER ... QUOTA 是唯一可靠设置方式
QUOTA 是硬性上限,不是建议值;超了就直接报错(如 ORA-01536),DML/DDL 都拦住。
-
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角色也不行(注意:这不影响读,也不删已有对象) -
QUOTA对临时表空间(TEMP)、撤销表空间(UNDOTBS1)无效——语法不报错,但实际不生效
别乱用 UNLIMITED TABLESPACE,它会绕过所有配额检查
GRANT UNLIMITED TABLESPACE TO app_user 看似方便,实则是高危操作:
- 它等效于给用户在所有现有及未来表空间上都设了
QUOTA UNLIMITED,且无法按表空间粒度控制 - 一旦授予,
DBA_TS_QUOTAS里查不到该用户的配额记录(因为配额机制被整体跳过) - 在多租户环境(CDB/PDB)中,该权限不自动继承到 PDB,必须在每个 PDB 内单独
GRANT - 审计策略或资源管理器(Resource Manager)可能禁用该权限,生产环境应避免
建用户时直接带配额最稳妥,避免“建完不能用”的尴尬期
事后补 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 - 注意:
QUOTA必须跟在对应ON <tablespace_name>后面,单位(M、G)要紧贴数字,不能有空格 -
QUOTA 0≠ 撤销权限,只是堵住写入口;要彻底收回豁免权,得REVOKE UNLIMITED TABLESPACE FROM app_user
真正容易被忽略的是:配额作用域是「表空间级」而非「数据库级」。一个用户在 USERS 配了 100M,在 DATA01 配了 500M,两者完全独立;建表时若显式指定 TABLESPACE other_ts,就必须提前给 other_ts 单独配额,否则照样报 ORA-01950。

















