必须同步配额、确认表空间ONLINE状态、避开大小写与引号陷阱,否则新建表仍落SYSTEM;ALTER USER DEFAULT TABLESPACE语法极敏感,多词(如SET)、少词、加引号、指定SYSTEM均报ORA-00922,且仅影响后续未显式指定表空间的新建对象。

不能只改 ALTER USER DEFAULT TABLESPACE 就完事,必须同步配额、确认表空间状态、避开大小写陷阱,否则新建表仍落 SYSTEM。
ALTER USER DEFAULT TABLESPACE 语法和常见报错
这条语句表面简单,但 Oracle 对关键词、大小写、引号极其敏感:
-
ALTER USER scott DEFAULT TABLESPACE users;✅ 正确(未加引号,Oracle 自动转大写) -
ALTER USER scott SET DEFAULT TABLESPACE users;❌ 多了SET,报ORA-00922: missing or invalid option -
ALTER USER scott DEFAULT TABLESPACE 'USERS';❌ 单引号非法,同样报ORA-00922 -
ALTER USER scott DEFAULT TABLESPACE "users";❌ 双引号强制小写匹配,但表空间实际名为USERS,报ORA-00959: tablespace 'users' does not exist
查真实表空间名用:SELECT tablespace_name FROM dba_tablespaces; —— 输出带双引号说明是大小写敏感创建的,否则一律按大写处理。
改完不生效?大概率缺配额或表空间离线
即使语句执行成功,新建对象仍可能写进旧表空间,原因不是语法问题,而是权限链断了:
- 目标表空间必须为
ONLINE状态:SELECT status FROM dba_tablespaces WHERE tablespace_name = 'USERS'; - 用户必须在该表空间有配额:
ALTER USER scott QUOTA 100M ON users;或授予UNLIMITED TABLESPACE(生产慎用) - 查当前默认值是否真更新:
SELECT default_tablespace FROM dba_users WHERE username = 'SCOTT'; - 已有连接会话不会刷新默认行为,新会话或新连接才生效
为什么不能把 SYSTEM 设为普通用户默认表空间
Oracle 明确禁止,不是权限不够,是硬性限制:
-
ALTER USER scott DEFAULT TABLESPACE system;必报ORA-00922,提示模糊,容易误判为语法错 -
SYSTEM和SYSAUX只能用于系统用户(SYS、SYSTEM等),普通用户必须用自定义永久表空间(如USERS、DATA) - 查可用非系统表空间:
SELECT tablespace_name FROM dba_tablespaces WHERE contents = 'PERMANENT' AND tablespace_name NOT IN ('SYSTEM', 'SYSAUX');
哪怕你用 SYS 身份执行,也过不了这一关。
老表不会自动迁移,得手动挪
很多人以为改了默认表空间,数据就“长腿跑过去了”,其实完全不是:
-
ALTER USER只影响后续新建对象(如没指定TABLESPACE的CREATE TABLE) - 已有表、索引、LOB 段全留在原表空间:
SELECT table_name, tablespace_name FROM user_tables;可验证 - 要迁移单个表:
ALTER TABLE t1 MOVE TABLESPACE users; - 要迁移索引:
ALTER INDEX i1 REBUILD TABLESPACE users; - 含 LOB 字段的表需额外处理:
ALTER TABLE t1 MOVE LOB(lob_col) STORE AS (TABLESPACE users);
迁移前务必确认目标表空间有足够空间,且用户已配额——否则直接卡在 ORA-01536。


















