alter user username temporary tablespace tsp_name 可直接修改单个用户临时表空间,但需确保目标表空间存在、在线且含有效tempfile,执行者须有alter user权限,新会话立即生效。

可以直接用 ALTER USER 修改,但必须确保目标临时表空间已存在且在线,否则会报错 ORA-01552: cannot use system rollback segment for non-system tablespace 或 ORA-00959: tablespace 'XXX' does not exist。
修改单个用户的临时表空间
最常用也最直接的方式是执行:ALTER USER username TEMPORARY TABLESPACE tsp_name;
- 用户名和表空间名都区分大小写,如果创建时用了双引号(比如
"Temp_TBS"),这里也必须带引号 - 目标临时表空间(如
tsp_name)必须已存在,且至少包含一个在线的tempfile;可通过SELECT status, name FROM v_$tempfile;确认状态为ONLINE - 执行者需具备
ALTER USER权限,通常只有SYS、SYSTEM或被显式授权的用户才能操作 - 该操作不中断用户当前会话,但新会话将立即使用新临时表空间;正在使用旧临时表空间的排序操作不受影响
批量修改多个用户的临时表空间
当要迁移一批用户(比如从 TEMP 切到 TMP_NEW),手写 SQL 容易出错,建议生成脚本:
SELECT 'ALTER USER ' || username || ' TEMPORARY TABLESPACE TMP_NEW;'
FROM dba_users
WHERE temporary_tablespace = 'TEMP'
AND username NOT IN ('SYS', 'SYSTEM');
- 排除
SYS和SYSTEM是关键:它们的临时表空间虽可改,但若误设为不存在或离线的表空间,可能导致后续 DBA 操作失败 - 生成的语句需人工核对再执行,尤其注意用户名中含特殊字符或大小写混用的情况
- 不建议在业务高峰期批量执行,因为每个
ALTER USER都会触发数据字典更新,高并发下可能短暂阻塞
为什么改了用户临时表空间,查询 DBA_USERS 却没立刻生效?
常见现象:执行完 ALTER USER ... TEMPORARY TABLESPACE 后立即查 DBA_USERS,TEMPORARY_TABLESPACE 字段仍是旧值。
- 这不是延迟,而是你查的是错误视图 ——
DBA_USERS显示的是用户属性定义,但真正生效的是会话级绑定。应查V$SESSION的TEMPSEG_SIZE和TABLESPACE列确认当前会话实际使用的临时表空间 - 更可靠的方式是查
SELECT username, temporary_tablespace FROM dba_users WHERE username = 'xxx';,这条语句本身没问题,但如果刚执行完就查不到,大概率是 SQL*Plus 没自动 commit(Oracle DDL 自动 commit,所以不是这个原因),而是你连错了实例或用了非 SYS/SYSTEM 账户执行但权限不足导致静默失败 - 另一个干扰项:用户登录后,其会话会缓存临时表空间信息,重启会话才能完全体现变更;但新连接一定走新配置
修改默认临时表空间(影响所有新用户)
数据库级默认值控制未指定 TEMPORARY TABLESPACE 的新建用户:
- 查当前默认值:
SELECT property_value FROM database_properties WHERE property_name = 'DEFAULT_TEMP_TABLESPACE'; - 改默认值:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tmp_new; - 注意:该命令不改变已有用户的设置,只影响后续
CREATE USER语句中未显式指定TEMPORARY TABLESPACE的情况 - 如果
tmp_new里没有 tempfile 或全部 offline,新建用户会创建失败并报ORA-12906: Cannot drop default temporary tablespace类似错误(实际是创建时校验失败)
最容易被忽略的是:临时表空间本身必须有可用 tempfile,且不能处于 OFFLINE 状态 —— 这点比永久表空间更严格,因为临时文件离线后无法像数据文件那样“恢复上线”,只能重建或替换。











