如何更改ORACLE中schema或user的名字

时间:2022-08-10 18:43:29

注:此文提供的方法非官方解决方法,正式环境下,保险起见,请不要滥用,以免引起不可逆的隐含问题。


前两天开发人员有个需求,要求把某个schema中所有对象移到另一个shema中,后来一想,不就是把schema的名字改了就可以了吗?这样就不用移来移去的,准备用DDL语句直接改的:

[sql] view plain copy
  1. alter user scott rename to scott2;  

发现根本没有这个语句,后来查了一下,才发现,oracle本身没有提供这个功能的语句,但有一个数据字典的表:user$,所有的用户都存在这张表中,可以直接update,就尝试着改了一下,发现还挺管用的,实现如下:

[sql] view plain copy
  1. SQL> desc user$;   --查看表结构  
  2.  Name                                      Null?    Type  
  3.  ----------------------------------------- -------- --------------  
  4.   
  5.  USER#                                     NOT NULL NUMBER  
  6.  NAME                                      NOT NULL VARCHAR2(30)  
  7.  TYPE#                                     NOT NULL NUMBER  
  8.  PASSWORD                                           VARCHAR2(30)  
  9.  DATATS#                                   NOT NULL NUMBER  
  10.  TEMPTS#                                   NOT NULL NUMBER  
  11.  CTIME                                     NOT NULL DATE  
  12.  PTIME                                              DATE  
  13.  EXPTIME                                            DATE  
  14.  LTIME                                              DATE  
  15.  RESOURCE$                                 NOT NULL NUMBER  
  16.  AUDIT$                                             VARCHAR2(38)  
  17.  DEFROLE                                   NOT NULL NUMBER  
  18.  DEFGRP#                                            NUMBER  
  19.  DEFGRP_SEQ#                                        NUMBER  
  20.  ASTATUS                                   NOT NULL NUMBER  
  21.  LCOUNT                                    NOT NULL NUMBER  
  22.  DEFSCHCLASS                                        VARCHAR2(30)  
  23.  EXT_USERNAME                                       VARCHAR2(4000)  
  24.  SPARE1                                             NUMBER  
  25.  SPARE2                                             NUMBER  
  26.  SPARE3                                             NUMBER  
  27.  SPARE4                                             VARCHAR2(1000)  
  28.  SPARE5                                             VARCHAR2(1000)  
  29.  SPARE6                                             DATE  
  30.   
  31. SQL> select user#,name from userwhere name='SCOTT'--找出需要更改的用户  
  32.   
  33.      USERNAME  
  34. ---------- ------------------------------  
  35.         84 SCOTT  
  36.   
  37. SQL> select count(*) from scott.emp;   
  38.   
  39.   COUNT(*)  
  40. ----------  
  41.         14  
  42.   
  43. SQL> update userset name='SCOTT2' where user#=84; --更改用户名  
  44.   
  45. 1 row updated.  
  46.   
  47. SQL> commit;  --记得提交  
  48. Commit complete.  
  49.   
  50.   
  51. SQL> select count(*) from scott.emp;  
  52.   
  53.   COUNT(*)  
  54. ----------  
  55.         14  
  56.   
  57.   
  58. SQL> alter system flush shared_pool; --刷新shared_pool  
  59. System altered.  
  60.   
  61. SQL> select count(*) from scott.emp;  
  62. select count(*) from scott.emp  
  63.                            *  
  64. ERROR at line 1:  
  65. ORA-00942: table or view does not exist  
  66.   
  67.   
  68. SQL> select count(*) from scott2.emp; --已经更改成功  
  69.   
  70.   COUNT(*)  
  71. ----------  
  72.         14  
如何更改ORACLE中schema或user的名字