在實際工作中,有時候需要修改使用者名稱,而通常的做法是exp imp這樣的方式,而如果資料量大的話exp imp的方式會很浪費時間,所以下面寫上如何通過修改ORACLE基表的方式來修改使用者名稱。
-- 直接修改底層表USER$更改使用者名稱(該方法在Oracle9i中測試通過)
SQL> UPDATE USER$ SET NAME='TT' WHERE USER#=91;
已更新 1 行。
SQL> COMMIT;
提交完成。
SQL> ALTER SYSTEM CHECKPOINT;
系統已更改。
SQL> ALTER USER TT IDENTIFIED BY VALUES '294CE6E7131DD890';
ALTER USER TT IDENTIFIED BY VALUES '294CE6E7131DD890'
*
ERROR 位於第 1 行:
ORA-01918: 使用者'TT'不存在
強制 Oracle 讀取實際資料,而不是讀取緩衝
SQL> ALTER SYSTEM FLUSH SHARED_POOL;
系統已更改。
SQL> ALTER USER TT IDENTIFIED BY VALUES '294CE6E7131DD890';
使用者已更改。
測試連接
SQL> CONN TT/TT
已串連。
SQL> SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
TEST_TT TABLE
SQL> CONN / AS SYSDBA
已串連。
SQL> SHOW USER
USER 為"SYS"
SQL> SHUTDOWN IMMEDIATE
資料庫已經關閉。
已經卸載資料庫。
ORACLE 常式已經關閉。
SQL> STARTUP
ORACLE 常式已經啟動。
......
資料庫裝載完畢。
資料庫已經開啟。
可以看出沒有再恢複為TEST
SQL> SELECT USER#,NAME,PASSWORD FROM USER$ WHERE USER#=91;
USER# NAME PASSWORD
---------- ------------------------------ ----------------
91 TT 294CE6E7131DD890
SQL> CONN TT/TT
已串連。
查看資料對象
SQL> SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
TEST_TT TABLE
SQL> SELECT * FROM TEST_TT;
A
-
A
對象許可權依然有效
SQL> SELECT * FROM TEST1.TEST1_TT;
A
-
A
系統許可權依然有效
SQL> CREATE TABLE KK AS SELECT * FROM TEST1.TEST1_TT;
表已建立。
SQL> SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
KK TABLE
TEST_TT TABLE
SQL> CONN / AS SYSDBA
已串連。
SQL> SHOW USER
USER 為"SYS"
--DROP USER 也沒有問題
SQL> DROP USER TT CASCADE;
使用者已丟棄
SQL> DROP USER TEST1 CASCADE;
使用者已丟棄