資料庫操作中常遇兩類情境:疏失誤刪/誤改關鍵資料,以及需週期性執行的重要任務。前者屬備份恢復範疇,後者屬任務排程。本文從應用開發角度,以 PL/SQL 為平台提供解決方案。
PL/SQL 為 SQL 引入程序化能力,但功能不如 C/Java 強大,Oracle 提供大量開發套件增強能力。本文聚焦 DBMS_FLASHBACK(閃回查詢)與 DBMS_JOB(任務排程)。
一般查詢針對當前時間,此套件可設定查詢時間點,檢視歷史資料狀態,對誤操作救援極具價值。核心函數:
ENABLE / DISABLE:啟動/關閉閃回模式,每次啟動前必先關閉。ENABLE_AT_TIME:設定查詢時間點(以當前時間為基準)。允許 PL/SQL 區塊按指定時間自動執行,類似定時器。需先設定兩個 init.ora 參數:
JOB_QUEUE_PROCESSES:背景處理程序數,為 0 則不執行作業。JOB_QUEUE_INTERVAL:檢查新作業的等待秒數,期間內作業最多執行一次。核心函數 SUBMIT(job, what, next_date, interval):提交作業並回傳作業編號。
假設基表 emp_table 有 3 筆資料,誤刪第一筆並已 COMMIT,無法 ROLLBACK。若誤操作發生於 5 分鐘前,可執行:
EXECUTE dbms_flashback.enable_at_time(sysdate - 5/1440);
此時查詢將顯示 5 分鐘前的完整資料。隨即備份:
CREATE TABLE emp_table_bk AS SELECT * FROM emp_table;
即完成資料恢復。
需每月對員工考核調薪,建立更新程序:
CREATE OR REPLACE PROCEDURE salary_upt(v_emp_no VARCHAR2, v_salary NUMBER) AS
BEGIN
UPDATE emp_table SET emp_salary = v_salary WHERE emp_no = v_emp_no;
COMMIT;
END;
排程每 30 天執行一次:
VARIABLE v_jobNum NUMBER;
BEGIN
DBMS_JOB.SUBMIT(:v_jobNum, 'salary_upt', SYSDATE, 'SYSDATE+30');
COMMIT;
END;
停止排程:DBMS_JOB.REMOVE(:v_jobNum);
此法易於與應用整合,操作便捷。
資料庫功能可透過應用程式擴展,後台開發人員除熟悉架構外,掌握應用開發能力至關重要。