修改 Oracle 用戶密碼是 DBA 日常高頻操作。本文涵蓋標準 ALTER USER IDENTIFIED BY、加密密碼值 IDENTIFIED BY VALUES、密碼驗證函數、批次修改腳本與常見錯誤處理。
-- 1. 以 SYSDBA 登入
CONN / AS SYSDBA
-- 2. 修改密碼
ALTER USER system IDENTIFIED BY manager;
-- User altered.
-- 3. 驗證新密碼
CONN system/manager
-- Connected.
SELECT USERNAME, PASSWORD FROM DBA_USERS;
-- PASSWORD 欄位儲存 SHA-1 雜湊值 (11g+) 或 DES 加密 (10g-)
-- 範例:SYSTEM 970BAA5B81930A40 → 修改後 → D4DF7931AB130E37
-- 1. 先取得目標密碼的加密值 (從其他庫或備份)
-- 假設 'oracle' 密碼對應加密值 '2D594E86F93B17A1'
-- 2. 直接套用加密值
ALTER USER system IDENTIFIED BY VALUES '2D594E86F93B17A1';
-- User altered.
-- 3. 驗證
CONN system/oracle -- 成功
CONN system/manager -- 失敗 ORA-01017
適用場景:跨環境同步密碼、避免明文出現在腳本/日誌、從備份還原密碼。
-- 查看當前 Profile 綁定的驗證函數
SELECT PROFILE, LIMIT FROM DBA_PROFILES
WHERE RESOURCE_NAME = 'PASSWORD_VERIFY_FUNCTION';
-- 預設 11g+ 為 ORA12C_VERIFY_FUNCTION (至少 8 字元、含大小寫、數字、特殊字元)
-- 關閉驗證
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL;
-- 自訂驗證函數範例 (至少 6 字元、含字母數字)
CREATE FUNCTION my_pwd_verify (
username VARCHAR2, password VARCHAR2, old_password VARCHAR2
) RETURN BOOLEAN IS
BEGIN
IF LENGTH(password) < 6 THEN
RAISE_APPLICATION_ERROR(-20001, '密碼長度至少 6 字元');
END IF;
IF NOT REGEXP_LIKE(password, '[A-Za-z]') OR NOT REGEXP_LIKE(password, '[0-9]') THEN
RAISE_APPLICATION_ERROR(-20002, '密碼需含字母與數字');
END IF;
RETURN TRUE;
END;
/
-- 套用至 Profile
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION MY_PWD_VERIFY;
DECLARE
CURSOR c_users IS
SELECT USERNAME, NEW_PASSWORD FROM PWD_CHANGE_LIST; -- 假設臨時表
BEGIN
FOR r IN c_users LOOP
BEGIN
EXECUTE IMMEDIATE 'ALTER USER ' || r.USERNAME || ' IDENTIFIED BY ' || r.NEW_PASSWORD;
DBMS_OUTPUT.PUT_LINE('Changed: ' || r.USERNAME);
UPDATE PWD_CHANGE_LIST SET STATUS='SUCCESS' WHERE USERNAME=r.USERNAME;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Failed: ' || r.USERNAME || ' - ' || SQLERRM);
UPDATE PWD_CHANGE_LIST SET STATUS='FAILED: '||SQLERRM WHERE USERNAME=r.USERNAME;
END;
END LOOP;
COMMIT;
END;
/
| 錯誤 | 原因 | 解決 |
|---|---|---|
| ORA-01031: insufficient privileges | 非 DBA/無 ALTER USER 權限 | 以 SYSDBA 或具備 ALTER USER 系統權限用戶執行 |
| ORA-28003: password verification failed | 密碼不符合 Profile 驗證函數規則 | 修改密碼符合規則、或暫時關閉驗證函數 |
| ORA-28015: account unlocked but password expired | 密碼已過期需重設 | ALTER USER ... IDENTIFIED BY new_pwd ACCOUNT UNLOCK |
安全最佳實務:1) 密碼輪換週期 90 天 2) 禁止重複近 5 代密碼 3) 啟用複雜度驗證 4) 審計所有 ALTER USER 操作 5) 生產環境禁止使用預設帳戶密碼。