在項目開發中,可能很多人都遇到這樣客戶要求:使用者操作資料庫關鍵記錄時要記錄使用者的ID,時間,修改的內容等,在必要的情況下要復原到某一時刻的記錄內容。如何解決?這裡我根據自己的工作經驗總結了三種解決方案,如有不當或者更好的方案請賜教 : )。
1.資料表冗餘記錄法
在關鍵的資料庫表中,加入 "建立時的日期時間"、"建立使用者"、"修改或刪除時的日期時間"、"修改或刪除使用者"、"選項組" 等欄位,當然了欄位名可以簡化,這裡為了更好的說明。“選項組”包括“當前可用”和“存檔”兩種狀態。當使用者修改記錄時,要執行兩步操作 1).更新當前資料庫記錄,記錄修改者和時間,把“選項組”改成“存檔”。2)建立一條記錄,把修改者和時間作為建立者和時間存入,儲存新的記錄內容,而“選項組”為“當前可用”。 如果使用者刪除記錄,只是執行第一步操作即可。
這種方案可以用程式在前台方便的察看記錄修改曆史情況,並可以很容易的復原到“某一時刻”,這裡的復原不是真正的復原,仍然要在表裡建立記錄,和上面提到的修改記錄操作相同,只不過記錄的內容是“某一時刻”的內容而已。
使用這種方法會造成資料庫表中記錄的過多儲存,在查詢和統計時效能會有影響。
2.建立資料表記錄操作
在資料庫中為關鍵資料表建立對應的“操作記錄表”,所有對關鍵記錄的修改、刪除甚至讀取都可以記錄在“操作記錄表”中,具體的實施可以在程式碼中控制,但更好的方法是可以使用觸發器控制。
這種方案也可以在前台方便的察看記錄修改曆史情況,並可以很容易的復原到“某一時刻”。但由於為每一個關鍵資料表都建立了“操作記錄表”也造成了Sql server的效能影響。
另外有第三方提供了採用這種方案的輔助程式:OmniAudit
下載http://www.ttdown.com/SoftView/SoftView_27817.html
3.使用Sql Server日誌
我們知道Sql Server資料庫除了資料檔案外,還有記錄檔,記錄檔記錄資料庫的變化情況,如果我們能察看記錄檔的內容也就等於知道了資料庫的操作曆史,但是微軟沒有提供諸如察看sql日誌的方法和介面等,好在有一個軟體提供了這種功能:
Lumigent Entegra For SQL Server ,下載頁面http://www.ttdown.com/SoftView/SoftView_30135.html
它能追蹤資料庫的所有改動情況,並且提供復原功能,還可以匯出操作曆史等。
這種方案的好處是不為資料庫增加任何負擔就可以察看記錄修改曆史情況,並可以很容易的復原到“某一時刻”。但是必須使用第三方的軟體,而不能在自己程式的前台操作。另外Lumigent Entegra For SQL Server v2.3.1對中文支援不太好,有些鬱悶。
期待更好的解決方案.....