Oracle用戶的狀態有幾種?分別表示什麼含義?程序員
Oracle用戶的狀態是由密碼來決定的,而Oracle中的密碼是由PROFILE來配置的。PROFILE是口令限制、資源限制的命令集合。當創建數據庫時,Oracle會自動創建名稱爲DEFAULT的PROFILE。當建立用戶而沒有指定PROFILE選項時,Oracle就會將DEFAULT分配給用戶。面試
經過以下的命令能夠查出與密碼相關的PROFILE的值:sql
1 SELECT *
2 FROM DBA_PROFILES D
3 WHERE D.PROFILE = 'DEFAULT'
4 AND (D.RESOURCE_NAME LIKE '%PASSWORD%' OR D.RESOURCE_NAME = 'FAILED_LOGIN_ATTEMPTS');
每一個參數的含義以下所示:數據庫
l FAILED_LOGIN_ATTEMPTS 設定登陸到Oracle數據庫時能夠失敗的次數。一旦某用戶嘗試登陸數據庫的次數達到該值時,該用戶的賬戶就被鎖定,只能由DBA解鎖。微信
l PASSWORD_LIFE_TIME 設定口令的有效時間(天數),一旦超過這一時間,必須從新設口令。缺省爲UNLIMITED。網絡
l PASSWORD_REUSE_TIME 許多系統不準用戶從新啓用過去用過的口令。該資源項設定了一個失效口令要通過多少天,用戶才能夠從新使用該口令,缺省爲180天。app
l PASSWORD_REUSE_MAX 從新啓用一個先前用過的口令前必須對該口令進行從新設置的次數(重複用的次數)。ide
l PASSWORD_LOCK_TIME 設定賬戶被鎖定的天數(當登陸失敗達到FAILED_LOGIN_ATTEMPTS時)。函數
l PASSWORD_GRACE_TIME 設定在口令失效前,給予的從新設置該口令的寬限天數。當口令失效以後,在登陸時會出現警告信息顯示該天數。若是沒有在寬限天內修改口令,那麼口令將失效。該參數默認爲7天。學習
l PASSWORD_VERITY_FUNCTION 該資源項容許調用一個PL/SQL來驗證口令。Oracle已提供該應用的腳本,爲$ORACLE_HOME/rdbms/admin/utlpwdmg.sql。可是,用戶能夠制定本身的驗證腳本。該參數的設定就是PL/SQL函數的名稱,缺省爲NULL。
用戶的狀態能夠由如下腳本查詢得到:
1SYS@lhrdb> SELECT * FROM USER_ASTATUS_MAP;
2 STATUS# STATUS
3---------- --------------------------------
4 0 OPEN
5 1 EXPIRED
6 2 EXPIRED(GRACE)
7 4 LOCKED(TIMED)
8 8 LOCKED
9 5 EXPIRED & LOCKED(TIMED)
10 6 EXPIRED(GRACE) & LOCKED(TIMED)
11 9 EXPIRED & LOCKED
12 10 EXPIRED(GRACE) & LOCKED
以上九種能夠分爲兩大類:1.基本狀態;2.組合狀態。前五種是基本狀態,後四種是組合狀態。具體分類以下圖所示:
每種狀態的解釋如表 3-16所示:
表 3-16 用戶狀態表
狀態序號 |
狀態 |
解釋 |
處理辦法 |
0 |
OPEN |
OPEN表示用戶處於正常狀態 |
|
1 |
EXPIRED |
密碼是否過時是經過修改PROFILE中的PASSWORD_LIFE_TIME實現的,表示該賬戶被設置爲口令到期,要求用戶在下次登陸的時候修改口令(系統會在該帳戶被設置爲EXPIRED後的第一次登錄是提示修改密碼)。能夠經過SQL語句(ALTER USER LHRSYS PASSWORD EXPIRE;)來顯式地讓用戶密碼過時 |
修改密碼: SELECT NB.PASSWORD FROM USER$ NB WHERE NB.NAME ='LHRSYS'; ALTER USER SCOTT IDENTIFIED BY VALUES 'F894844C34402B67'; |
2 |
EXPIRED(GRACE) |
當設置了GRACE之後(第一次成功登陸後到口令到期後有多少天時間可改變口令。在這段時間內,賬戶被提醒修改口令並能夠正常登錄,ACCOUNT_STATUS顯示爲EXPIRED(GRACE) |
修改密碼: SELECT NB.PASSWORD FROM USER$ NB WHERE NB.NAME ='LHRSYS'; ALTER USER SCOTT IDENTIFIED BY VALUES 'F894844C34402B67'; |
4 |
LOCKED(TIMED) |
表示失敗的登陸次數超過了FAILED_LOGIN_ATTEMPTS的值,被系統自動鎖定。須要注意的是,從Oracle 10g開始,默認的DEFAULT值是10次,這個限制是由PROFILE中的FAILED_LOGIN_ATTEMPTS控制的,該信息能夠經過DBA_PROFILES視圖查詢 |
解鎖用戶:ALTER USER LHRSYS ACCOUNT UNLOCK; |
8 |
LOCKED |
DBA顯式地經過SQL語句對用戶進行鎖定(ALTER USER LHRSYS ACCOUNT LOCK;) |
ALTER USER LHRSYS ACCOUNT UNLOCK; |
5 |
EXPIRED & LOCKED(TIMED) |
表示用戶密碼過時後,失敗登陸次數超過PROFILE中的FAILED_LOGIN_ATTEMPTS的限制 |
將用戶UNLOCK並修改密碼: ALTER USER LHRSYS ACCOUNT UNLOCK; ALTER USER LHRSYS IDENTIFIED BY LHR; |
6 |
EXPIRED(GRACE) & LOCKED(TIMED) |
表示用戶在密碼過時後的有效期內,失敗登陸次數超過PROFILE中的FAILED_LOGIN_ATTEMPTS的限制 |
將用戶UNLOCK並修改密碼: ALTER USER LHRSYS ACCOUNT UNLOCK; ALTER USER LHRSYS IDENTIFIED BY LHR; |
9 |
EXPIRED & LOCKED |
EXPIRED & LOCKED狀態表示用戶密碼過時且同時處於鎖定狀態 |
將用戶UNLOCK並修改密碼: ALTER USER LHRSYS ACCOUNT UNLOCK; ALTER USER LHRSYS IDENTIFIED BY LHR; |
10 |
EXPIRED(GRACE) & LOCKED |
表示用戶在密碼過時後的有效期內被DBA手工鎖定 |
將用戶UNLOCK並修改密碼: ALTER USER LHRSYS ACCOUNT UNLOCK; ALTER USER LHRSYS IDENTIFIED BY LHR; |
在Oracle中,若用戶的密碼變爲鎖定狀態(LOCKED、LOCKED(TIMED))時,DBA能夠直接執行「ALTER USER用戶名 ACCOUNT UNLOCK」來解鎖。可是,若是用戶的狀態變成過時狀態(EXPIRED、EXPIRED(GRACE)),那麼DBA必需要更改用戶的密碼帳戶才能從新使用。但有些時候,由於各類緣由並不知道原密碼的明文是什麼,這時候能夠有以下2種辦法來更新密碼。
1、用原密碼的密文來更改密碼
在Oracle 10g中,DBA_USERS視圖的PASSWORD字段提供了密碼的密文形式,而在Oracle 11g中,該字段被棄用了,內容爲空,可是在基表USER$中的PASSWORD字段依然有記錄密文形式,因此能夠經過以下的形式來獲取密碼的密文形式:
1SELECT D.USERNAME,
2 D.ACCOUNT_STATUS,
3 D.LOCK_DATE,
4 D.EXPIRY_DATE,
5 D.PROFILE,
6 NVL(D.PASSWORD,(SELECT NB.PASSWORD FROM USER$ NB WHERE NB.NAME = D.USERNAME)) PASSWORD
7 FROM DBA_USERS D
8 WHERE D.USERNAME = 'LHRSYS';
另外,能夠經過DBMS_METADATA.GET_DDL包或者expdp、exp命令來獲取建立用戶的語句從而獲取密碼的密文形式。
1SYS@lhrdb> set long 9999
2SYS@lhrdb> SELECT DBMS_METADATA.GET_DDL('USER', 'LHRSYS') DDL_SQL FROM DUAL;
3DDL_SQL
4--------------------------------------------------------------------------------
5 CREATE USER "LHRSYS" IDENTIFIED BY VALUES 'S:853EA80BAE11F79D6946453F38059E30313FE84C96AE2EE4F3AA35A648BD;F809740420A44EFC'
6 DEFAULT TABLESPACE "USERS"
7 TEMPORARY TABLESPACE "TEMP"
獲取了密碼的密文後就能夠用以下的命令來修改了,注意:使用密文的命令中多了一個VALUES關鍵字:
1SYS@lhrdb> alter user LHRSYS identified by values 'F809740420A44EFC';
2User altered.
3SYS@lhrdb> CONN LHRSYS/lhr@192.168.59.129/lhrdb
4Connected.
5LHRSYS@192.168.59.129/lhrdb> conn / as sysdba
6Connected.
7SYS@lhrdb> alter user LHRSYS identified by values 'S:853EA80BAE11F79D6946453F38059E30313FE84C96AE2EE4F3AA35A648BD;F809740420A44EFC';
8User altered.
9SYS@lhrdb> CONN LHRSYS/lhr@192.168.59.129/lhrdb
10Connected.
因此,即便不知道用戶的原密碼是什麼,也能夠用它的密文來更改密碼。這樣既保持了密碼不改變,又能夠把EXPIRED的狀態更改掉。
在MOS The Impact of PASSWORD_LIFE_TIME Database Profile Parameter Default to 180 Days on Network Charging and Control (文檔 ID 1543668.1)中搜到了以下的命令也能夠直接獲取密碼:
1SELECT SQLTEXT
2 FROM (SELECT NAME,'ALTER USER ' || NAME || ' IDENTIFIED BY VALUES ''' ||PASSWORD || ''';' SQLTEXT
3 FROM USER$
4 WHERE SPARE4 IS NULL
5 AND PASSWORD IS NOT NULL
6 UNION
7 SELECT NAME,
8 'ALTER USER ' || NAME || ' IDENTIFIED BY VALUES ''' || SPARE4 || ';' ||PASSWORD || ''';' SQLTEXT
9 FROM USER$
10 WHERE SPARE4 IS NOT NULL
11 AND PASSWORD IS NOT NULL)
12 WHERE NAME = 'LHRSYS';
2、直接更新USER$基表
無論用戶的狀態是什麼,經過更新USER$表可讓用戶處於OPEN狀態:
1SYS@lhrdb> SELECT USERNAME, ACCOUNT_STATUS,EXPIRY_DATE,LOCK_DATE FROM DBA_USERS WHERE USERNAME = 'LHRSYS';
2USERNAME ACCOUNT_STATUS EXPIRY_DATE LOCK_DATE
3------------------------------ -------------------------------- ------------------- -------------------
4LHRSYS EXPIRED 2016-12-02 10:40:09
5SYS@lhrdb> UPDATE USER$ SET ASTATUS=0 WHERE NAME='LHRSYS';
61 row updated.
7SYS@lhrdb> commit;<<<<<<<<<------及時提交
8Commit complete.
9SYS@lhrdb> SELECT USERNAME, ACCOUNT_STATUS,EXPIRY_DATE,LOCK_DATE FROM DBA_USERS WHERE USERNAME = 'LHRSYS';
10USERNAME ACCOUNT_STATUS EXPIRY_DATE LOCK_DATE
11------------------------------ -------------------------------- ------------------- -------------------
12LHRSYS OPEN
& 說明:
有關用戶密碼的更多內容能夠參考個人BLOG:http://blog.itpub.net/26736162/viewspace-2129595/
本文選自《Oracle程序員面試筆試寶典》,做者:李華榮。
詳細內容能夠添加麥老師微信或QQ私聊。
● 本文做者:小麥苗,只專一於數據庫的技術,更注重技術的運用
● 做者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列題目來源於做者的學習筆記,部分整理自網絡,如有侵權或不當之處還請諒解
● 版權全部,歡迎分享本文,轉載請保留出處
● QQ:646634621 QQ羣:618766405
● 提供OCP、OCM和高可用部分最實用的技能培訓
● 題目解答如有不當之處,還望各位朋友批評指正,共同進步
長按下圖識別二維碼或微信掃描下圖二維碼來關注小麥苗的微信公衆號:xiaomaimiaolhr,學習最實用的數據庫技術。
本文分享自微信公衆號 - DB寶(lhrdba)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。