Oracle中ALTER USER修改临时表空间的关键要点 在Oracle数据库里,用ALTER USER语句修改用户的临时表空间,可不是随便填个名字就能成的。这里头有几个硬性规定:目标表空间必须真实存在,而且类型得是TEMPORARY(即CONTENTS='TEMPORARY'
在Oracle数据库里,用ALTER USER语句修改用户的临时表空间,可不是随便填个名字就能成的。这里头有几个硬性规定:目标表空间必须真实存在,而且类型得是TEMPORARY(即CONTENTS='TEMPORARY'PERMANENT)或者撤销表空间(UNDO),操作立马就会失败。另外,表空间名称的大小写必须严格匹配。还有个细节值得注意:修改成功后,这个变动只对用户后续的新操作生效,并不会影响当前已经存在的会话。
简单来说,你不能直接用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'的表空间。'temp_new'很可能查不到记录,除非这个表空间创建时特意加了双引号。DBA_TABLESPACES视图,因为USER_TABLESPACES视图不会显示其他用户创建的表空间。语法本身并不复杂,但关键在于参数值必须精确匹配一个已经存在的临时表空间名称:
ALTER USER scott TEMPORARY TABLESPACE temp_new;
不过,在实际操作中,下面这几个场景容易让人踩坑:
ALTER USER语句通常也能执行成功。只不过,新分配的临时段会走向新的表空间,而旧的临时段会在释放后被系统自动清理。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语句,或者新的排序操作,才会开始使用新的表空间。这一点和修改默认表空间不同,临时表空间的设置不会“继承”到当前会话的上下文中。理解这一点,对于排查后续的存储和性能问题至关重要。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述