剛剛學習Access不久,在建立表的過程中發(fā)現(xiàn)一個問題:
如果允許用戶通過窗體直接從數(shù)據(jù)表中刪除數(shù)據(jù),可能不安全。會出現(xiàn)一種情況——即,用戶刪除了他權(quán)限上允許他刪,而事實上卻很重要的數(shù)據(jù)(出于誤刪,或是根本就是惡意刪除)。這時候就需要找回數(shù)據(jù),應(yīng)該做恢復數(shù)據(jù)及回滾覆蓋操作。這就有個如何安全恢復的問題。
假設(shè):恰好數(shù)據(jù)被刪除掉之后沒有被立刻發(fā)現(xiàn),很多員工又繼續(xù)用了相當長一段時間,產(chǎn)生了大量數(shù)據(jù);而之前的數(shù)據(jù)庫備份又比較久遠,這就比較麻煩,以我現(xiàn)在的水平從Access底層是解決不了的。
受權(quán)限表的設(shè)計原理啟發(fā),我想到可以在數(shù)據(jù)表中添加輔助字段,形如"WantDelete"(是否刪除字段),"WantHide"(是否隱藏顯示字段),"IfActive"(是否活動字段),"LastEdit"(上次編輯記錄的ID字段),"DeleteTime"(記錄編輯時間字段),"EditTime"(記錄編輯時間字段)來控制用戶端的操作:
我的構(gòu)想是:
1.新增:用戶的新增操作像以前一樣可以進行,新加的"WantDelete","WantHide"字段默認為否,"IfActive"默認為真,"LastEdit","DeleteTime"字段為空,"EditTime"字段為新增時間。
2.刪除:用戶的任何刪除操作都不是對表中數(shù)據(jù)做任何實際操作的,而是對"WantDelete""WantHide""IfActive"打鉤,程序?qū)?/span>"WantDelete""WantHide"已打鉤項目進行隱藏操作;在查詢的時候?qū)?/span>"IfActive"進行判斷,對不活動的記錄不進行操作;同時將刪除操作的時間記入"DeleteTime"字段。
3.編輯:編輯操作轉(zhuǎn)變?yōu)?/div>
->對原紀錄做Copy新增
->在Copy記錄中的"LastEdit"中寫入原記錄的ID
->在Copy記錄中"EditTime"記下當前時間
->將Copy記錄的"WantDelete","WantHide"字段設(shè)置為否,"IfActive"設(shè)置為真,"DeleteTime"字段設(shè)為空
->在原記錄中,設(shè)置僅將"WantHide"值為真,"IfActive"設(shè)置為否,"DeleteTime"字段記錄記下當前時間(不設(shè)置"WantDelete"為真是為了方便管理員區(qū)分編輯和刪除操作)
->刷新顯示的時候,實際上是做的數(shù)據(jù)篩選,將"IfActive"設(shè)置為否的記錄隱藏掉。
4.查詢:設(shè)計查詢的時候,把"IfActive"為否的記錄篩掉不做操作,這樣就可以做到類似顯示真實刪除掉記錄后的效果。
可以方便的在管理員界面進行管理,提取數(shù)據(jù)生成日志報表,并對真的需要刪掉的記錄由管理員進行最終的備份+刪除操作。
關(guān)于數(shù)據(jù)恢復的操作:
恢復數(shù)據(jù)操作的主體應(yīng)該是管理員,由管理員對隱藏掉的數(shù)據(jù)進行回溯查詢,找到數(shù)據(jù)記錄正確的數(shù)據(jù)條,修改其相應(yīng)的"WantDelete","WantHide","IfActive","LastEdit","DeleteTime","EditTime"字段的值即可。
后記:
后來想了一下,這個設(shè)計應(yīng)該能做的更好:其實應(yīng)該將記錄添加人,刪除人,編輯操作人作為單獨的字段獨立出來,記錄下做操作的員工ID對后續(xù)的管理會更有幫助。
先把這個實現(xiàn)以后調(diào)試一段時間看看效果,感覺這里面應(yīng)該還可以深入,放在以后講。