在數據庫操作中時常會有這樣的情況發生,由於一時的疏忽而誤刪或誤改了一些重要的數據,另外還有一些重要的任務需要周期性地運行。顯然,前一類問題主要是數據備份與恢復方面的,而後一類則主要是系統的任務調度。本文將針對這兩類問題,從應用程序開發角度給出一個解決方法。
一.技術基礎
由於本文是使用PL/SQL作為開發平台來提供解決方案,所以首先了解相關的背景知識。
PL/SQL本身只是作為SQL語句的一個補充,通過引入過程化的概念來增強數據庫處理能力。然而,相對於C,C++,Java等過程化語言來說,PL/SQL的處理功能依然不夠強大。為此,Oracle數據庫提供了大量的應用程序開發包,來增強應用程序開發能力。根據本文的主題,介紹如下兩個開發包:DBMS_FlashBACK和DBMS_JOB。
1. DBMS_FLASHBACK包主要是用來進行倒敘查詢使用的,即通過設置查詢時間來確定該時刻下的查詢結果。一般情況下,我們平時使用的查詢是查詢當前時間(sysdate)下的數據。使用DBMS_FlashBACK包就可以查詢以前數據的狀態,這一功能對於誤處理的情形而言就顯得極為重要。下面是該包中的兩個主要函數介紹:
·Enable與disable:分別是啟動和關閉倒敘查詢功能。應該注意的是,每次啟動倒敘查詢之前應首先關閉倒敘模式。
·Enable_at_time:設置查詢的時間點,它是以當前時間為起點進行設置的。
2. DBMS_JOB包是用來對PL/SQL塊進行調度的實用包,它允許PL/SQL塊在指定的時間內自動運行,類似於VC中的Settimer這樣的定時器。為便於該包的運行,需要首先設置兩個init.ora參數:
·JOB_QUEUE_PROCESS指定啟動的後台處理數。如果它是0或沒有被設置,將沒有後台處理進入作業,它們也就不會運行。
·JOB_QUEUE_INTERVAL以秒為單位,指定每一個過程在檢查新的作業前等待的時間。在JOB_QUEUE_INTERVA所指定的時間內,一個作業最多只能運行一次。
設置好這兩個參數後,就可對程序進行調度了,該包主要使用SUBMIT函數進行調度,該函數的原型為:
submit(返回的作業號,程序過程名,sysdate,下次運行的時間);
二.數據恢復
數據恢復是數據庫本身一個極其重要的功能,通常重要的數據可以通過其系統的數據備份功能來實現,所以在實際的開發中,重要的數據往往容易恢復,反而是一些平常的數據因為誤操作而引起一些麻煩。
對於有經驗的開發人員來說,往往會對那些開發需要的基表(基表就是提供數據源的數據表)做一些備份。這樣,即使以後出現一些數據誤操作也不會導致重大的事故。
更為實用而又很少為開發人員所使用的方法就是采用倒敘查詢,鑒於前面已經有了一定的技術鋪墊,現在就可以使用DBMS_FlashBACK包來對數據進行恢復了。為方便講述,假定一個基表emp_table,其表記錄如下:
Emp_no Emp_name Emp_salary 001 Jacky 5000 002 Rose 6000 003 John 7000
即此表僅有3條記錄,那麼由於對數據庫的誤操作,導致第一條記錄被刪除,