注:此文提供的方法非官方解决方法,正式环境下,保险起见,请不要滥用,以免引起不可逆的隐含问题。
前两天开发人员有个需求,要求把某个schema中所有对象移到另一个shema中,后来一想,不就是把schema的名字改了就可以了吗?这样就不用移来移去的,准备用DDL语句直接改的:
[sql] view plain copy- alter user scott rename to scott2;
发现根本没有这个语句,后来查了一下,才发现,oracle本身没有提供这个功能的语句,但有一个数据字典的表:user$,所有的用户都存在这张表中,可以直接update,就尝试着改了一下,发现还挺管用的,实现如下:
[sql] view plain copy- 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