在一次例行操作中,我意外執行了一條 UPDATE 語句,將正式庫 com 下 taw_rm_user 表的所有用戶密碼全部修改為 123456。發現錯誤後,立即冷靜分析:系統有定期 DMP 邏輯備份(最近一次為 9 月 28 日),但經過十一長假,正式庫已新增多名用戶並修改了其他字段,直接導入備份會導致數據丟失。
com(生產數據)comtest(測試數據)taw_rm_user 表,結構相同password 字段,其他字段及新增用戶需保留CREATE TABLE AS 將 comtest.taw_rm_user 複製到臨時表 comtest.taw_rm_user_bak,避免後續操作污染測試數據。DROP TABLE comtest.taw_rm_user。IMP 工具將 9 月 28 日備份中的 taw_rm_user 導入 comtest 模式下,此時測試庫擁有誤操作前的密碼數據。user_id 匹配的記錄的 password 更新回 com.taw_rm_user,新增用戶不受影響。taw_rm_user_bak 重命名回 taw_rm_user,測試庫恢復原狀。CREATE TABLE comtest.taw_rm_user_bak
AS
SELECT * FROM comtest.taw_rm_user;
DECLARE
rec_comtest comtest.taw_rm_user%ROWTYPE;
CURSOR cur_comtest IS
SELECT * FROM comtest.taw_rm_user;
BEGIN
OPEN cur_comtest;
LOOP
FETCH cur_comtest INTO rec_comtest;
EXIT WHEN cur_comtest%NOTFOUND;
UPDATE com.taw_rm_user
SET password = rec_comtest.password
WHERE user_id = rec_comtest.user_id;
END LOOP;
CLOSE cur_comtest;
COMMIT;
END;
此方案巧妙利用測試庫作為「中轉站」,結合邏輯備份與程序化對比更新,在零停機、不影響新增數據的前提下,精準修復了誤操作造成的密碼篡改問題,展現了 Oracle 多模式協作與 PL/SQL 靈活處理能力。