2016-07-13 9 views
2

5つの子の外部キー関係を持つテーブルのWebアプリケーションで、「削除」機能の動作を変更する必要があります。かなり大規模なWebアプリケーションであるため、Webアプリケーションの変更を最小限に抑えるために、リスクが最も低く影響度が最も低いものを探しています。外部キーの関係を持つデータに対してSQLでソフト削除を実装する方法は?

私は2つのオプションを考えることができます:

  1. はデフォルト0とテーブルdeletedに列を追加し、1は、レコードが削除されていることを示します。これには、テーブル上のすべての選択項目を更新する必要があります(また、孤立しているので、その子テーブルには、where deleted = 0を含める必要があります)。ウェブアプリは古くてよく書かれていないので(繰り返しコード)、この変更が必要な場所がたくさんあるので、1つ以上の場所が見逃される危険性があります。

  2. レコードをテーブルの別のコピー、特に削除されたレコードに移動します。私は、すべての子テーブルも同様にミラーリングする必要があります。

オプション1は、アップフロント多くの努力のようですが、将来的にはより保守、オプション2は、アップフロント多くの仕事ではない、Webアプリケーションへの最小限の変更が、非常に厄介。他のオプションはありますか?

+0

は、SQL Server 2016上にある場合は、多分、オプション1に働くだろうレベルのセキュリティを行https://msdn.microsoft.com/en-us/us-en/library/dn765131(= 0削除フィルタリング) .aspx – vercelli

+1

動作を変更する理由は何ですか?これらのソフト削除されたレコードを使用する場合は、たとえば。オプション1よりも履歴データを表示するためには、基本的に唯一の選択肢です。アーキテクチャの観点からは、オプション2を使用して2つのデータベースミラーを同期させることもできます。特に、誰かがソースの構造変更を行う場合は問題があります。その点から、2つのデータベースの変更を追跡する必要があります。お勧めします。 – StormoPL

答えて

2

これは私がとても好きな理由の優れた例です。

  • 新しい列を作成し、削除された
  • テーブルの名前を変更しますのMyData => AllMyData
  • だけのために、テーブルそれは前に見て正確な方法からのデータを公開し、古い名前のビューを作成します。 「削除されていない」行

例:

create view MyData as 
    select ... 
    from AllMyData 
    where Deleted = 0 
  • 書き込みは、それが元のテーブルであるかのようにDMLを処理するために、ビューにトリガします。

  • 削除された行を公開する別のビューを作成します。

例:

create view DeletedMyData as 
    select ... 
    from AllMyData 
    where Deleted = 1 
  • は、アプリ内の "ソフト削除" と "元に戻す" 機能を実装します。このコードは、テーブルに直接アクセスする唯一のコードであり、必要に応じてDeletedの値を0または1に設定します。 既存のコードは変更する必要はありません。

  • 子テーブルは、おそらく変更を必要としません。削除されていないビュー(元のテーブル名を持つビュー)に結合することによってクエリが実行される可能性が高いため、「削除された」データを参照するレコードは公開されませんが、データが削除されないと自動的に再公開されます。

関連する問題