改用戶名的用處
至於改名字的用處嘛,在這樣一種情景下非常有用.假如某個公司給每個員工一個賬戶,用戶名就是你的英文名.當某個員工arwen要離職了,那就要刪除掉用戶arwen了.但是我們知道oracle中用戶與此用戶下面創建的對象是完全綁定到一起的,而不像sql server中表等對象是可以和用戶完全分開.這樣的話你一刪掉用戶arwen那下面的數據全沒了.假如我們需要那些數據咋整呢,最容易想到的是把所有數據先導出,然后再導入到某個用戶下面.但這樣比較麻煩.所以如果能改名字就更好點了. www.2cto.com
怎么改用戶名
接着用上面的例子.假如又來了新員工,weiwenhp.他是接arwen的班的.所以他很需要用戶arwen下面的數據.此時就把用戶arwen改成用戶weiwenhp.我們登陸
數據庫時,數據庫系統會判斷我們的用戶名和密碼正確不,那我們自然想到這些信息肯定保存在數據庫里面哪個地方,肯定會有一個啥保存用戶信息的表.沒錯,所以用戶信息保存在表user$中.
select * from user$
www.2cto.com
用這個sql一查你會看到所有用戶名和密碼,還有其他一些信息.不過用戶名都是
加密的.所以即使是管理員也看不到任何用戶的密碼,只能改用戶的密碼.
那肯定想,用戶名和密碼在這那我在這里把名字改下就行了啊.實際上改名就真這么做.
select user#, name from user$ where name = 'ARWEN'; --先瞧下arwen的信息,其中user#就是一個序列號,相當於身份證號吧,假如這里是250
update user$ set name = 'WEIWENHP' where user# = 250; --於是用戶名就改好了啊.當然是update語句就記得再commit提交下啊.
還要做的工作
當上面那樣改好名字后你就興高采烈的想去登陸下試試,瞧瞧改了用戶名后真能登陸不.結果一登發現登不了.而用之前的帳戶arwen還能登.這時你就傻眼了.這是咋回事啊?
我人知道要是改了密碼的話馬上就生效能用的啊,改名字了咋就不成了呢.
我們知道數據庫中很重要的一點是要保證數據一致性,某個地方的數據更改了,相關的地方也得跟着改才好.那這里肯定是因為登陸時讀取的用戶信息還沒有更新.有數據不一致性的情況出現.你可能會想到有時我們用alter更改一些參數信息得重啟數據庫才能生效.於是你就想不會我改了名還得重啟數據庫.這也太恐怖了吧.
實際上不用重啟數據庫拉,你這樣強制更新下.
alter system checkpoint;
alter system flush shared_pool;
你再次登陸就發現可以登陸了啊.而之前的arwen用戶就登不了啊.
不過像上面這樣改用戶名不太方便,估計很少有DBA去這樣做吧.因為出現要改用戶名的場景確實不多.而且就算要改先導出再導入也能做到.
想干壞事明文顯示密碼
剛上面你發現用戶名和密碼都在一個表中,而密碼都是加密后的密文,你於是就想我能不能想辦法給整成明文.這樣就可以瞧見別人密碼了,方便干啥壞事啊.於是你就想用改名字相同的做法
www.2cto.com
update user$ set password = 'abc' where user# = 250;
alter system checkpoin;
alter system flush shared_pool;
select * from user$ where name = 'arwen' -- 此時你發現密碼竟然真變成明文了,abc.於是你可樂壞了
於是你迫不及待的想登陸下看真能用不.
結果讓你很是沮喪,竟然登不了.而且用戶arwen原來的密碼也報廢了.於是只能乖乖的用alter再來改下.
www.2cto.com
alter user arwen identified by abc; --這樣改下就能登了.
改成明文后不能登,但改的時候又沒報錯.不知道oracle背后是咋整的.我覺得嘛按道理應該改表user$中的密碼時就應該提示說不能改才比較好呢.
哎不過反正也沒哪個管理員真會閑得蛋痛去干把密碼明文顯示的無聊事吧.所以咋整也無所謂了.
我用的是oracle 11gr1 .不知道早期啥oracle的版本能真的把密碼改成明文而又能登陸不.
(需要system賬號,sysdba身份,否則提示表不存在)
原文地址:http://www.2cto.com/database/201210/162610.html