很多人都以為oracle可以很容易的改密碼,但不能改使用者名稱字.實際上名字也可以改的.只不過改起來有點麻煩.
改使用者名稱的用處
至於改名字的用處嘛,在這樣一種情景下非常有用.假如某個公司給每個員工一個賬戶,使用者名稱就是你的英文名.當某個員工arwen要離職了,那就要刪除掉使用者arwen了.但是我們知道oracle中使用者與此使用者下面建立的對象是完全綁定到一起的,而不像sql server中表等對象是可以和使用者完全分開.這樣的話你一刪掉使用者arwen那下面的資料全沒了.假如我們需要那些資料咋整呢,最容易想到的是把所有資料先匯出,然後再匯入到某個使用者下面.但這樣比較麻煩.所以如果能改名字就更好點了.
怎麼改使用者名稱
接著用上面的例子.假如又來了新員工,weiwenhp.他是接arwen的班的.所以他很需要使用者arwen下面的資料.此時就把使用者arwen改成使用者weiwenhp.我們登陸資料庫時,資料庫系統會判斷我們的使用者名稱和密碼正確不,那我們自然想到這些資訊肯定儲存在資料庫裡面哪個地方,肯定會有一個啥儲存使用者資訊的表.沒錯,所以使用者資訊儲存在表user$中.
select * from user$
用這個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去這樣做吧.因為出現要改使用者名稱的情境確實不多.而且就算要改先匯出再匯入也能做到.
想幹壞事明文顯示密碼
剛上面你發現使用者名稱和密碼都在一個表中,而密碼都是加密後的密文,你於是就想我能不能想辦法給整成明文.這樣就可以瞧見別人密碼了,方便幹啥壞事啊.於是你就想用改名字相同的做法
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再來改下.
alter user arwen identified by abc; --這樣改下就能登了.
改成明文後不能登,但改的時候又沒報錯.不知道oracle背後是咋整的.我覺得嘛按道理應該改表user$中的密碼時就應該提示說不能改才比較好呢.
哎不過反正也沒哪個管理員真會閑得蛋痛去幹把密碼明文顯示的無聊事吧.所以咋整也無所謂了.
我用的是oracle 11gr1 .不知道早期啥oracle的版本能真的把密碼改成明文而又能登陸不.