必须严格使用ALTER USER username DEFAULT TABLESPACE tablespace_name;语法,漏词、多词(如SET)、加引号或指定SYSTEM/SYSAUX均报ORA-00922;修改仅影响后续新建对象,已有对象物理位置不变。
直接改就行,但语法错一个字就报 ora-00922,且改完老表不会动。
ALTER USER DEFAULT TABLESPACE 语句怎么写才不报错
必须严格按 ALTER USER username DEFAULT TABLESPACE tablespace_name; 格式,漏词、多词、引号全都会挂:
- ❌
ALTER USER scott SET DEFAULT TABLESPACE users;—— 多了SET,报ORA-00922: missing or invalid option - ❌
ALTER USER scott DEFAULT TABLESPACE 'USERS';—— 单引号包表空间名,Oracle 不认,报ORA-00959: tablespace 'USERS' does not exist - ❌
ALTER USER scott DEFAULT TABLESPACE system;——SYSTEM是系统表空间,普通用户禁止设为默认,同样报ORA-00922(不是更明确的提示,容易误判) - ✅
ALTER USER scott DEFAULT TABLESPACE users;—— 小写、大写、混合都行,只要表空间真实存在且大小写匹配(没用双引号建的话,不区分大小写)
执行前必须确认的三件事
否则语句会失败,或后续建对象时报错:
- 目标表空间已存在且状态为
ONLINE:查SELECT tablespace_name, status FROM dba_tablespaces WHERE contents = 'PERMANENT'; - 用户在该表空间上有配额(
QUOTA):查SELECT username, tablespace_name, bytes/1024/1024 AS mb FROM dba_ts_quotas WHERE username = 'SCOTT';;没配额就先跑ALTER USER scott QUOTA UNLIMITED ON users;或指定大小 - 不能是
SYSTEM或SYSAUX:这两个是 Oracle 系统保留表空间,强行指定会静默拒绝(报ORA-00922,不是权限类错误)
改完之后,哪些对象会受影响
只影响「后续新建」且未显式指定 TABLESPACE 的对象:
- ✅ 新建的表(
CREATE TABLE t1 (id NUMBER);)会落在新默认表空间 - ✅ 新建的索引(
CREATE INDEX i1 ON t1(id);)也走新默认表空间 - ❌ 已存在的表、索引、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: space quota exceeded
最常被忽略的点:以为改了默认表空间就能释放旧表空间磁盘,结果发现 users01.dbf 还是 20G —— 因为老对象根本没动过。得主动搬,或者删掉不用的老对象再 shrink 数据文件。


















