在 Oracle 11g 環境中,使用者常會遇到 ORA-28002: the password will expire within 或 ORA-28000: the account is locked 等提示。這類問題主要源於預設設定檔的兩項核心參數限制,本文將系統性分析成因並提供生產環境可直接套用的解決方案。
Oracle 11g 預設的 DEFAULT 設定檔包含兩項關鍵限制:
這兩項參數獨立運作,可能單獨或同時觸發問題。值得注意的是,resource_limit 參數無論設為 TRUE 或 FALSE,密碼有效期限制皆會生效,必須透過修改設定檔方式解決。
SQL> SELECT username, profile FROM dba_users;
USERNAME PROFILE
------------------------------ ------------------------------
SYS DEFAULT
SYSTEM DEFAULT
EKPUSER DEFAULT
SQL> SELECT * FROM dba_profiles
WHERE profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';
PROFILE RESOURCE_NAME RESOURCE_TYPE LIMIT
-------- -------------------- ------------- --------
DEFAULT PASSWORD_LIFE_TIME PASSWORD 180
SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
Profile altered.
注意: 修改即時生效,無需重啟資料庫。
SQL> ALTER USER smsc IDENTIFIED BY 原密碼;
SQL> ALTER USER system IDENTIFIED BY root;
SQL> ALTER USER scott IDENTIFIED BY tiger;
SQL> SELECT username, profile FROM dba_users;
SQL> SELECT * FROM dba_profiles
WHERE profile='DEFAULT' AND resource_name='FAILED_LOGIN_ATTEMPTS';
SQL> ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;
SQL> ALTER USER smsc IDENTIFIED BY oracle ACCOUNT UNLOCK;
-- 或單純解鎖
SQL> ALTER USER 用戶名 ACCOUNT UNLOCK;
SQL> SELECT * FROM dba_profiles WHERE profile='DEFAULT';
PROFILE RESOURCE_NAME RESOURCE_TYPE LIMIT
-------- ------------------------ ------------- ----------------------
DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD UNLIMITED
DEFAULT PASSWORD_LIFE_TIME PASSWORD UNLIMITED
若需更精細的密碼策略,可建立專用設定檔:
CREATE PROFILE app_users2 LIMIT
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LIFE_TIME 60
PASSWORD_REUSE_TIME 60
PASSWORD_REUSE_MAX 5
PASSWORD_VERIFY_FUNCTION verify_function
PASSWORD_LOCK_TIME 1/24
PASSWORD_GRACE_TIME 10;
-- 指派給使用者
ALTER USER username PROFILE app_users2;
DEFAULT 設定檔為最快解決方案,影響所有使用該設定檔的使用者