為了防止誤刪除,通用權限管理里有2個方法可以阻止誤刪除,1個是打刪除標志的方法,另外一個把數據備份到被刪除表里(另外一個表里),喜歡用哪個方式要看開發人員的選擇看項目的性質靈活運用,覺得哪個做法好就可以用哪個方法,刪除標志的方法雖然簡單但是過濾數據很麻煩而且數據庫量超大后數據庫的性能有明顯的影響。
把被刪除的數據備份到另外一個表雖然程序處理繁雜一些但是數據庫的性能影響會很小數據庫的性能一直會比較高一些,有對數據有潔癖的人適合用這個方式。通過下面的例子程序可以模仿通用權限管理的防止誤刪除功能,把自己的業務系統都進行改造,思路思想也都可以借鑒一下。
天氣涼爽、總算有心情寫個博客了,把被誤刪除的數據需要恢復過來時不是專業的數據庫管理員,那是一個很艱難的事情,而且知道哪些數據被刪除了也不是那么簡單的事情,寫個數據庫觸發器是一個不錯的處理方法,把當前要被刪除的數據都存放到相同結構的另外一個備份表里。 對於數據的備份功能自增量主鍵而言GUID為主鍵的表處理起來更簡單一些。
被刪除的表,主鍵最好不是自增量,因為需要保留原始數據的主鍵,否則數據庫很難恢復或者涉及到主細表的問題等等,所以被刪除的表的主鍵建議不要用則增量。
我們在角色管理界面上選中2條數據庫,在調試模式下,然后按刪除,看程序的運行效果如何?
已經被放到被刪除的表里來了,主鍵也沒被篡改,非常不錯。
這個是為了特意在測試調試模式下把被刪除的數據轉移到另外一個表的做法。
下面是沒有采用數據庫觸發器的方式,對刪除的表進行數據備份的方法。
1:這里設計到備份表的主鍵問題。
2:數據庫事務問題,要么成功,要么失敗,要么全成功。
3:不要數據庫觸發器,而是用程序去實現。
4:兼容多種數據庫。
5:下出來的代碼量非常小,不能有過於繁瑣的代碼,需要重復利用很多現有的類庫。
6:由於系統同時支持多個子系統,意思是有可能是多個系統的不同的角色表,所以要支持多系統的權限管理說白了就是多表的操作,不只是固定的2個表。
/// 批量刪除角色
/// </summary>
/// <param name="userInfo"> 用戶 </param>
/// <param name="ids"> 主鍵數組 </param>
/// <returns> 影響行數 </returns>
public int BatchDelete(BaseUserInfo userInfo, string[] ids)
{
// 寫入調試信息
#if (DEBUG)
int milliStart = BaseBusinessLogic.StartDebug(userInfo, MethodBase.GetCurrentMethod());
#endif
// 加強安全驗證防止未授權匿名調用
#if (!DEBUG)
LogOnService.UserIsLogOn(userInfo);
#endif
int returnValue = 0;
using (IDbHelper dbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.UserCenterDbType))
{
try
{
dbHelper.Open(UserCenterDbConnection);
// 開始數據庫事務
dbHelper.BeginTransaction();
string tableName = BaseRoleEntity.TableName;
if (! string.IsNullOrEmpty(BaseSystemInfo.SystemCode))
{
tableName = BaseSystemInfo.SystemCode + " Role ";
}
BaseRoleManager roleManager = new BaseRoleManager(dbHelper, userInfo, tableName);
// 這里是直接刪除功能的實現
// returnValue = roleManager.BatchDelete(ids);
BaseRoleEntity roleEntity = null;
// 把刪除的記錄放到被刪除的表里(表名后面加了后綴Deleted,也可以放在另外一個數據庫里也可以的)
BaseRoleManager roleDeletedManager = new BaseRoleManager(dbHelper, userInfo, tableName + " Deleted ");
foreach ( var id in ids)
{
// 逐個刪除,逐個備份
roleEntity = roleManager.GetEntity(id);
// 先添加到被刪除的表里,這時候原先數據的主鍵需要保留的,否則恢復數據時可能會亂套
roleDeletedManager.Add(roleEntity);
// 數據備份好后再進行刪除處理
returnValue += roleManager.Delete(id);
}
// 提交數據庫事務
BaseLogManager.Instance.Add(dbHelper, userInfo, serviceName, AppMessage.RoleService_BatchDelete, MethodBase.GetCurrentMethod());
dbHelper.CommitTransaction();
}
catch (Exception ex)
{
// 撤銷數據庫事務
dbHelper.RollbackTransaction();
BaseExceptionManager.LogException(dbHelper, userInfo, ex);
throw ex;
}
finally
{
dbHelper.Close();
}
}
// 寫入調試信息
#if (DEBUG)
BaseBusinessLogic.EndDebug(MethodBase.GetCurrentMethod(), milliStart);
#endif
return returnValue;
}
通用權限管理系統的架構,幾乎沒修改幾行代碼,就可以實現用戶的刪除數據是備份數據的需求,雖然沒數據庫觸發器處理那么簡單,但是程序的靈活性很強,可閱讀性、可調試性、多數據庫的兼容性等等方面,還是有明顯的優點的。
刪除處理的方法還可以寫在代碼生成器里,這樣所有的刪除操作,都可以實現數據庫的備份了,又簡單又好用,也不用動腦子了,很省事。