能改,但语法错一个字就报 ORA-00922,且仅影响新建对象;老表不动、磁盘不释放。必须用 ALTER USER username DEFAULT TABLESPACE tsname;,禁用 SET、引号,禁用 SYSTEM,目标表空间须存在、在线且用户有配额。
能改,但语法错一个字就报 ora-00922,且改完新建对象才生效——老表不会自动挪,磁盘空间也不会释放。
ALTER USER DEFAULT TABLESPACE 语法必须严格匹配
Oracle 11g 要求语句必须是 ALTER USER username DEFAULT TABLESPACE tablespace_name;,少词、多词、错序全报错。
-
ALTER USER scott DEFAULT TABLESPACE users;✅ 正确(大小写不敏感,USERS或users都行) -
ALTER USER scott SET DEFAULT TABLESPACE users;❌ 多了SET,报ORA-00922: missing or invalid option -
ALTER USER scott DEFAULT TABLESPACE 'users';❌ 单引号非法,Oracle 不接受字符串字面量写法 -
ALTER USER scott DEFAULT TABLESPACE "USERS";❌ 双引号强制大小写匹配,除非建表空间时明确用了"USERS",否则报ORA-00959: tablespace 'USERS' does not exist
目标表空间必须存在、在线、且用户有配额
执行成功 ≠ 生效。新建表仍落在旧表空间?大概率是以下任一条件没满足:
- 查表空间是否存在且在线:
SELECT tablespace_name, status FROM dba_tablespaces WHERE tablespace_name = 'USERS';—— 状态必须是ONLINE - 查用户当前默认值:
SELECT default_tablespace FROM dba_users WHERE username = 'SCOTT'; - 最关键:用户在目标表空间上必须有配额,否则建表直接报
ORA-01950: no privileges on tablespace 'USERS' - 配额要显式赋:
ALTER USER scott QUOTA 10M ON users;或ALTER USER scott QUOTA UNLIMITED ON users;(后者慎用于生产)
SYSTEM 表空间不能设为普通用户的默认表空间
这是 Oracle 的硬性限制,和权限无关,DBA 角色也绕不过去。
-
ALTER USER scott DEFAULT TABLESPACE system;必报ORA-00922(不是更明确的错误码,容易误判成语法问题) - 可用替代方案:
USERS(开发常用)、DATA、EXAMPLE或自定义的非系统表空间 - 确认可用永久表空间:
SELECT tablespace_name FROM dba_tablespaces WHERE contents = 'PERMANENT' AND tablespace_name NOT IN ('SYSTEM', 'SYSAUX');
改完 default tablespace,老对象完全不动
这是最常被忽略的点:修改只影响后续未指定 TABLESPACE 子句的新建对象(如 CREATE TABLE t1 (...);),已有表、索引、LOB 段物理位置不变。
- 验证现有对象位置:
SELECT table_name, tablespace_name FROM user_tables; - 想迁移已有表:
ALTER TABLE t1 MOVE TABLESPACE users;(注意:会锁表,需业务窗口) - 想迁移索引:
ALTER INDEX idx1 REBUILD TABLESPACE users; - 迁移前务必确认新表空间有足够空间,且用户已分配对应配额,否则报
ORA-01536: space quota exceeded











