2016-07-13 47 views
2

我有一個要求更改具有5個子外鍵關係的表上的Web應用程序上的「刪除」功能的行爲。它是一個相當大的Web應用程序,所以我正在尋找風險最小,影響最小的更改,以便它將對Web應用程序進行最少量的更改。如何在SQL中使用外鍵關係實現軟刪除數據?

我能想到的兩個選項:

  1. 列添加到表deleted默認0,並且1將指示記錄已被刪除。這將需要更新表上的所有選擇(以及在它的子表上,因爲它們現在是孤立的),以包括子句where deleted = 0。網絡應用程序是舊的,寫得不好(重複代碼),所以有很多地方需要這種改變,因此可能會錯過一個或多個位置是有風險的。

  2. 將記錄移動到表的另一個副本,專門用於刪除的記錄。我可能也需要鏡像每個子表。

選項1似乎是更多的努力了前面,但是在將來更易於維護,選擇2是沒有太多的工作了前面,微小的變化對Web應用程序,但非常凌亂。還有其他選擇嗎?

+0

如果你的SQL Server 2016上,也許行級安全期權1將工作(過濾刪除= 0)https://msdn.microsoft.com/en-us/us-en/library/dn765131 .aspx – vercelli

+1

改變行爲背後的原因是什麼?如果你打算使用這些軟刪除記錄,例如。顯示歷史數據比選項1基本上是唯一的選擇。從架構的角度來看,我也會選擇1,因爲同步兩個數據庫鏡像將會產生問題,特別是如果有人會對源進行一些結構更改 - 那麼您將從這一點開始跟蹤2個數據庫的更改,這不是我會推薦。 – StormoPL

回答

2

這是一個很好的例子,爲什麼我如此喜歡看法。

  • 創建新列,刪除
  • 重命名錶:邁德特=> AllMyData
  • 創建一個公開從表正是之前看的方式,數據的舊名稱的視圖,但僅限於「未刪除」行。

實施例:

create view MyData as 
    select ... 
    from AllMyData 
    where Deleted = 0 
  • 寫觸發的視圖來處理DML,如果它是原始表。

  • 創建另一個視圖來公開已刪除的行。

實施例:

create view DeletedMyData as 
    select ... 
    from AllMyData 
    where Deleted = 1 
  • 實現一個 「軟刪除」 和 「取消刪除」 應用程序內的功能性。此代碼將是唯一直接訪問表的代碼,並根據需要將「已刪除」的值設置爲0或1。 現有的代碼將不需要修改。

  • 子表可能根本不需要更改。由於可能通過加入未刪除的視圖(具有原始表名稱的視圖)來查詢它們,所以涉及「已刪除」數據的記錄將不會被公開,但會在數據未刪除時自動重新公開。