注:此文提供的方法非官方解决方法,正式环境下,保险起见,请不要滥用,以免引起不可逆的隐含问题。
前两天开发人员有个需求,要求把某个schema中所有对象移到另一个shema中,后来一想,不就是把schema的名字改了就可以了吗?这样就不用移来移去的,准备用DDL语句直接改的:
alter user scott rename to scott2;
发现根本没有这个语句,后来查了一下,才发现,oracle本身没有提供这个功能的语句,但有一个数据字典的表:user$,所有的用户都存在这张表中,可以直接update,就尝试着改了一下,发现还挺管用的,实现如下:
SQL> desc user$; --查看表结构
Name Null? Type
----------------------------------------- -------- --------------
USER# NOT NULL NUMBER
NAME NOT NULL VARCHAR2(30)
TYPE# NOT NULL NUMBER
PASSWORD VARCHAR2(30)
DATATS# NOT NULL NUMBER
TEMPTS# NOT NULL NUMBER
CTIME NOT NULL DATE
PTIME DATE
EXPTIME DATE
LTIME DATE
RESOURCE$ NOT NULL NUMBER
AUDIT$ VARCHAR2(38)
DEFROLE NOT NULL NUMBER
DEFGRP# NUMBER
DEFGRP_SEQ# NUMBER
ASTATUS NOT NULL NUMBER
LCOUNT NOT NULL NUMBER
DEFSCHCLASS VARCHAR2(30)
EXT_USERNAME VARCHAR2(4000)
SPARE1 NUMBER
SPARE2 NUMBER
SPARE3 NUMBER
SPARE4 VARCHAR2(1000)
SPARE5 VARCHAR2(1000)
SPARE6 DATE
SQL> select user#,name from user$ where name='SCOTT'; --找出需要更改的用户
USER# NAME
---------- ------------------------------
84 SCOTT
SQL> select count(*) from scott.emp;
COUNT(*)
----------
14
SQL> update user$ set name='SCOTT2' where user#=84; --更改用户名
1 row updated.
SQL> commit; --记得提交
Commit complete.
SQL> select count(*) from scott.emp;
COUNT(*)
----------
14
SQL> alter system flush shared_pool; --刷新shared_pool
System altered.
SQL> select count(*) from scott.emp;
select count(*) from scott.emp
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select count(*) from scott2.emp; --已经更改成功
COUNT(*)
----------
14