oracle中alter user修改临时表空间时,目标表空间必须存在且类型为temporary(content='temporary'),不能是permanent或undo类型,大小写需严格匹配,修改后仅新操作生效,不影响当前会话。
oracle中不能直接用 alter user 把用户临时表空间设成一个不存在的表空间,否则会报 ora-00959: tablespace 'xxx' does not exist;而且即使表空间存在,如果它不是临时表空间类型(即 type = 'temporary'),也会失败。
确认目标表空间是否为合法临时表空间
临时表空间必须是 TYPE = 'TEMPORARY' 的,普通永久表空间(PERMANENT)不能用于 TEMPORARY TABLESPACE 子句。执行以下查询验证:
SELECT tablespace_name, contents FROM dba_tablespaces WHERE tablespace_name = 'TEMP_NEW';
如果返回 PERMANENT,说明这个表空间不能用——哪怕名字叫 TEMP_NEW 也没用。
- 只接受
CONTENTS = 'TEMPORARY'的表空间 - 注意大小写:Oracle 默认大写,
'temp_new'可能查不到(除非建的时候加了双引号) - 查询要用
DBA_TABLESPACES,USER_TABLESPACES不显示其他用户创建的表空间
用ALTER USER修改临时表空间的正确语法
语法很简单,但关键在参数值必须精确匹配已存在的临时表空间名:
ALTER USER scott TEMPORARY TABLESPACE temp_new;
常见错误场景:
- 用户正在使用原临时表空间中的排序段(如大查询未结束),该语句仍可执行成功,但新分配的临时段会走新表空间,旧段释放后自然清理
- 如果目标表空间是
UNDO类型(如UNDOTBS1),会报ORA-03217: invalid option for alter of temporary tablespace - 指定表空间名带引号(如
"temp_new")且大小写不一致,会导致找不到对象
检查修改是否生效
改完别急着走,立刻查 DBA_USERS 确认:
SELECT username, temporary_tablespace FROM dba_users WHERE username = 'SCOTT';
注意:
- 普通用户查
USER_USERS只能看到自己,看不到TEMPORARY TABLESPACE字段(该字段为空) - 如果用户有
DBA角色,DBA_USERS中的值才可信;否则可能被DEFAULT TABLESPACE干扰判断 - 修改不触发任何会话重连,当前连接仍用原临时表空间,直到下次需要临时段时才切换
真正容易被忽略的是:临时表空间变更对已有活跃事务无影响,但新登录会话、新解析SQL、新排序操作才会走新表空间——这点和默认表空间不同,它不“继承”到当前会话上下文里。










