DBA 需以普通用戶身份執行操作,但不知其密碼,且不允許永久修改密碼影響應用。解決方案:記錄加密密碼 → 修改密碼 → 操作完成 → 恢復原密碼。
DBA_USERS.PASSWORD 存儲的是加密哈希值(11g+ 為 SHA-1,12c+ 為 PBKDF2)ALTER USER ... IDENTIFIED BY VALUES 'hash' 可直接按哈希值恢復密碼,無需明文ACCOUNT UNLOCK 解鎖被鎖定用戶-- 1. 以 SYSDBA 連接
SQL> CONNECT / AS SYSDBA
-- 2. 查詢目標用戶加密密碼
SQL> SELECT USERNAME, PASSWORD FROM DBA_USERS WHERE USERNAME = 'SYSTEM';
USERNAME PASSWORD
-------- ------------------------------
SYSTEM 2D594E86F93B17A1
-- 3. 修改密碼為已知值
SQL> ALTER USER SYSTEM IDENTIFIED BY MANAGER;
User altered.
-- 4. 解鎖(如被鎖定)
SQL> ALTER USER SYSTEM ACCOUNT UNLOCK;
User altered.
-- 5. 以新密碼登入執行業務操作
SQL> CONNECT SYSTEM/MANAGER
Connected.
-- ... 執行所需操作 ...
-- 6. 恢復原密碼(使用 VALUES 子句)
SQL> CONNECT / AS SYSDBA
SQL> ALTER USER SYSTEM IDENTIFIED BY VALUES '2D594E86F93B17A1';
User altered.
-- 7. 驗證原密碼生效
SQL> CONNECT SYSTEM/ORACLE -- 原密碼
Connected.
CREATE OR REPLACE PROCEDURE TEMP_CHANGE_PWD(
P_USER VARCHAR2,
P_NEW_PWD VARCHAR2,
P_ACTION VARCHAR2 -- 'BACKUP' | 'RESTORE'
) AS
V_HASH VARCHAR2(100);
BEGIN
IF P_ACTION = 'BACKUP' THEN
SELECT PASSWORD INTO V_HASH FROM DBA_USERS WHERE USERNAME = UPPER(P_USER);
-- 存入臨時表或上下文
INSERT INTO TMP_PWD_BACKUP(USERNAME, PASSWORD_HASH, BACKUP_TIME)
VALUES (UPPER(P_USER), V_HASH, SYSDATE);
EXECUTE IMMEDIATE 'ALTER USER ' || P_USER || ' IDENTIFIED BY ' || P_NEW_PWD;
EXECUTE IMMEDIATE 'ALTER USER ' || P_USER || ' ACCOUNT UNLOCK';
COMMIT;
ELSIF P_ACTION = 'RESTORE' THEN
SELECT PASSWORD_HASH INTO V_HASH
FROM TMP_PWD_BACKUP WHERE USERNAME = UPPER(P_USER)
AND BACKUP_TIME = (SELECT MAX(BACKUP_TIME) FROM TMP_PWD_BACKUP WHERE USERNAME = UPPER(P_USER));
EXECUTE IMMEDIATE 'ALTER USER ' || P_USER || ' IDENTIFIED BY VALUES ''' || V_HASH || '''';
DELETE FROM TMP_PWD_BACKUP WHERE USERNAME = UPPER(P_USER) AND PASSWORD_HASH = V_HASH;
COMMIT;
END IF;
END;
/
-- 使用
EXEC TEMP_CHANGE_PWD('SCOTT','TEMP123','BACKUP');
-- ...操作...
EXEC TEMP_CHANGE_PWD('SCOTT',NULL,'RESTORE');
| 風險點 | 說明 | 對策 |
|---|---|---|
| 密碼版本差異 | 11g/12c/18c/19c 哈希算法不同,VALUES 子句需匹配版本 | 同版本庫間操作,跨版本遷移用 Data Pump |
| 密碼驗證函數 | PROFILE 中 PASSWORD_VERIFY_FUNCTION 可能拒絕簡單密碼 | 臨時分配無限制 PROFILE 或關閉驗證 |
| 審計觸發 | ALTER USER 會產生審計記錄 | 操作前通知安審,事後提供證據鏈 |
| 應用連接池 | 修改密碼導致連接池報錯,應用重連風暴 | 維護窗口操作,配合應用停機或漸進式切換 |
| Data Guard 同步 | 主庫修改密碼需同步到備庫 | 確保 DG 同步正常,或備庫同步執行 |
10g+ 支持代理用戶,無需知道目標密碼即可以其身份操作:
-- 授權代理
ALTER USER SCOTT GRANT CONNECT THROUGH DBA_USER;
-- DBA_USER 以 SCOTT 身份連接
CONNECT DBA_USER[SCOTT]/DBA_PASS@DB
-- 當前用戶即為 SCOTT,權限、審計均按 SCOTT 計算
UTLPWDMG.SQL)