【DB筆試面試543】Oracle用戶的狀態有幾種?分別表示什麼含義?

  • 2019 年 10 月 10 日
  • 筆記

題目部分

Oracle用戶的狀態有幾種?分別表示什麼含義?

答案部分

Oracle用戶的狀態是由密碼來決定的,而Oracle中的密碼是由PROFILE來配置的。PROFILE是口令限制、資源限制的命令集合。當建立資料庫時,Oracle會自動建立名稱為DEFAULT的PROFILE。當創建用戶而沒有指定PROFILE選項時,Oracle就會將DEFAULT分配給用戶。

通過如下的命令可以查出與密碼相關的PROFILE的值:

 SELECT *     FROM DBA_PROFILES D    WHERE D.PROFILE = 'DEFAULT'      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天。

l PASSWORD_REUSE_MAX 重新啟用一個先前用過的口令前必須對該口令進行重新設置的次數(重複用的次數)。

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。

用戶的狀態可以由以下腳本查詢獲得:

SYS@lhrdb> SELECT * FROM USER_ASTATUS_MAP;     STATUS# STATUS  ---------- --------------------------------           0 OPEN           1 EXPIRED           2 EXPIRED(GRACE)           4 LOCKED(TIMED)           8 LOCKED           5 EXPIRED & LOCKED(TIMED)           6 EXPIRED(GRACE) & LOCKED(TIMED)           9 EXPIRED & LOCKED          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欄位依然有記錄密文形式,所以可以通過如下的形式來獲取密碼的密文形式:

SELECT D.USERNAME,         D.ACCOUNT_STATUS,         D.LOCK_DATE,         D.EXPIRY_DATE,         D.PROFILE,         NVL(D.PASSWORD,(SELECT NB.PASSWORD FROM USER$ NB WHERE NB.NAME = D.USERNAME)) PASSWORD    FROM DBA_USERS D   WHERE D.USERNAME = 'LHRSYS';  

另外,可以通過DBMS_METADATA.GET_DDL包或者expdp、exp命令來獲取創建用戶的語句從而獲取密碼的密文形式。

SYS@lhrdb> set long 9999  SYS@lhrdb> SELECT DBMS_METADATA.GET_DDL('USER', 'LHRSYS') DDL_SQL FROM DUAL;  DDL_SQL  --------------------------------------------------------------------------------     CREATE USER "LHRSYS" IDENTIFIED BY VALUES 'S:853EA80BAE11F79D6946453F38059E30313FE84C96AE2EE4F3AA35A648BD;F809740420A44EFC'        DEFAULT TABLESPACE "USERS"        TEMPORARY TABLESPACE "TEMP"  

獲取了密碼的密文後就可以用如下的命令來修改了,注意:使用密文的命令中多了一個VALUES關鍵字:

SYS@lhrdb> alter user LHRSYS identified by values 'F809740420A44EFC';  User altered.  SYS@lhrdb> CONN  LHRSYS/[email protected]/lhrdb  Connected.  [email protected]/lhrdb> conn / as sysdba  Connected.  SYS@lhrdb> alter user LHRSYS identified by values 'S:853EA80BAE11F79D6946453F38059E30313FE84C96AE2EE4F3AA35A648BD;F809740420A44EFC';  User altered.  SYS@lhrdb> CONN  LHRSYS/[email protected]/lhrdb  Connected.  

所以,即使不知道用戶的原密碼是什麼,也可以用它的密文來更改密碼。這樣既保持了密碼不改變,又可以把EXPIRED的狀態更改掉。

在MOS The Impact of PASSWORD_LIFE_TIME Database Profile Parameter Default to 180 Days on Network Charging and Control (文檔 ID 1543668.1)中搜到了如下的命令也可以直接獲取密碼:

SELECT SQLTEXT    FROM (SELECT NAME,'ALTER USER ' || NAME || ' IDENTIFIED BY VALUES ''' ||PASSWORD || ''';' SQLTEXT            FROM USER$           WHERE SPARE4 IS NULL             AND PASSWORD IS NOT NULL          UNION          SELECT NAME,                 'ALTER USER ' || NAME || ' IDENTIFIED BY VALUES ''' || SPARE4 || ';' ||PASSWORD || ''';' SQLTEXT            FROM USER$           WHERE SPARE4 IS NOT NULL             AND PASSWORD IS NOT NULL)   WHERE NAME = 'LHRSYS';  

2、直接更新USER$基表

不管用戶的狀態是什麼,通過更新USER$表可以讓用戶處於OPEN狀態:

SYS@lhrdb> SELECT USERNAME, ACCOUNT_STATUS,EXPIRY_DATE,LOCK_DATE FROM DBA_USERS WHERE USERNAME = 'LHRSYS';  USERNAME                       ACCOUNT_STATUS                   EXPIRY_DATE         LOCK_DATE  ------------------------------ -------------------------------- ------------------- -------------------  LHRSYS                         EXPIRED                          2016-12-02 10:40:09  SYS@lhrdb> UPDATE USER$ SET ASTATUS=0 WHERE NAME='LHRSYS';  1 row updated.  SYS@lhrdb> commit;<<<<<<<<<------及時提交  Commit complete.  SYS@lhrdb> SELECT USERNAME, ACCOUNT_STATUS,EXPIRY_DATE,LOCK_DATE FROM DBA_USERS WHERE USERNAME = 'LHRSYS';  USERNAME                       ACCOUNT_STATUS                   EXPIRY_DATE         LOCK_DATE  ------------------------------ -------------------------------- ------------------- -------------------  LHRSYS                         OPEN  

& 說明:

有關用戶密碼的更多內容可以參考我的BLOG:http://blog.itpub.net/26736162/viewspace-2129595/

本文選自《Oracle程式設計師面試筆試寶典》,作者:李華榮。