Oracle中没有提供直接修改用户名的方法,即使在11gR2中也没有提供具体的手段。由于没有直接修改用户名的方法,因此在Oracle中若要修改用户名,通常是比较周折的。通常修改用户名的一种方法是:重新创建一个新用户,把原用户中的数据使用EXP/IMP方法迁移到新用户中,最后删除原用户。如果用户所包含的数据量非常的巨大,这个过程将相当的耗时,对系统的冲击也比较大。
有没有更好的方法来完成这个修改用户名的方法呢?这里给出一个通过修改Oracle数据库基表USER$达到修改Oracle用户名的目的。
1.在基表user$中查看待修改用户TEST的基本信息
SQL> conn /as sysdba
Connected.
SQL> select user#,name,password from user$ where name ='TEST';
USER# NAME PASSWORD
---------- ------------------------------ ------------------------------
91 TEST 7A0F2B316C212D67
注意:里面存放的用户都是大写!
2.直接使用update语句将USER#列修改为新的用户名SECOOLER
1)修改
SQL> update user$ set name='SECOOLER' where user#=91;
1 row updated.
2)提交
SQL> commit;
Commit complete.
3)确认修改完毕
SQL> select user#,name,password from user$ where USER# = 91;
USER# NAME PASSWORD
---------- ------------------------------ ------------------------------
91 SECOOLER 7A0F2B316C212D67
3.为使新用户的密码生效,我们尝试重置新用户名SECOOLER的密码
SQL> alter user secooler identified by secooler;
User altered.
4. 测试连接
SQL> conn secooler/secooler
Connected.
说明:以上是在oracle11g 11.1.0.6.0 版本测试成功。
以下是在oracle10g的版本上执行。
4.手工执行检查点操作,将Database Buffer Cache中的数据强制写出到外存,这一步骤不是关键。
SQL> alter system checkpoint;
System altered.
5.关键步骤在此--强制刷新Shared Pool!因为Oracle的数据字典信息是缓存在Shared Pool的Dictionary Cache中的。
SQL> alter system flush shared_pool;
System altered.
6.开始修改SECOOLER的密码,成功!整个通过基表修改方法修改用户名的操作全部完成。
1)修改密码,成功。
SQL> alter user secooler identified by secooler;
User altered.
2)确认密码确实发生了变化
SQL> select user#,name,password from user$ where USER# = 65;
USER# NAME PASSWORD
---------- ------------------------------ ------------------------------
91 SECOOLER 7A0F2B316C212D67
3)测试新用户的可用性
SQL> conn secooler/secooler
Connected.
SQL> show user
USER is "SECOOLER"
7.小结
在修改完基表后,更彻底的使其生效的方法是重新启动数据库。不过无论是使用“flush shared_pool”还是“startup force;”对于运行要求比较高的生产系统来说都会面临数据库短暂无法提供服务的情况。因此,在使用这种方法之前同样需要做好计划,预见到影响。
注意:不建议使用这种方法来修改用户名,早期规划并严格按照规范执行避免用户名的随意修改才是正途。