質問

silverlightアプリケーションにCRUDを実装していますが、従来の方法で削除機能を実装したくないので、代わりにデータベース内でデータを非表示に設定したいです。

SQL Serverデータベースでこれを行う方法を知っている人はいますか?

ヘルプに感謝します。

役に立ちましたか?

解決

Lukaszのアイデアを拡張する、datetime列も便利です。

  • NULL =現在
  • 値=ソフト削除時

これにより、ビット列ではできない単純なバージョン管理が追加されます。

他のヒント

テーブルに別の列を追加できます" deleted&quot ;;値は0または1で、deleted = 0のレコードのみを表示します。

ALTER TABLE TheTable ADD COLUMN deleted BIT NOT NULL DEFAULT 0

削除されていない行のみを取得するビューを作成することもできます。

CREATE VIEW undeleted AS SELECT * FROM TheTable WHERE deleted = 0

そして、削除コマンドは次のようになります:

UPDATE TheTable SET deleted = 1 WHERE id = ...

ほとんどの場合、削除トリガーを使用して、削除された行をアーカイブテーブルにアーカイブします。この方法で、各行を削除したユーザーをキャプチャすることもできますが、削除された行はパフォーマンスに影響しません。削除されたテーブルを含める場合、両方のテーブルを結合するビューを作成できます。

Lukasz Lysikが示唆するとおり、 「削除済み」のフラグとして機能するフィールド行を表示し、表示したくない場合は除外します。私はこれを多くのアプリケーションで使用しました。

別の提案として、既存のステータスコードがある場合は、追加のステータス割り当てを追加します。たとえば、内部的に使用するクラス出席アプリでは、出席レコードを「インポート済み」、「登録済み」、「完了」、「未完了」などにすることができます*-「削除済み」を追加しました意図しない重複がある場合のオプション。そうすればレコードがあり、問題に新しい列を投げるだけではありません。

*これは、舞台裏で使用される数値コードの表示名です。明確にするだけです。 :)

トリガーを使用したソリューション

もしあなたがDBトリガーと友達なら、あなたは考慮するかもしれません:

  • テーブルに DeletedAtおよびDeletedBy 列を追加します
  • 各テーブルのビューを作成します(例:テーブル Customer には CustomerView ビューがあり、 DeletedAt ではなくnull(日付列を含む gbn のアイデア)
  • すべてのCRUD操作は通常どおり実行されますが、 Customer テーブルではなく、 CustomerView
  • で実行されます 行を物理的に削除するのではなく、削除としてマークする
  • INSTEAD OF DELETE トリガーを追加します。
    • この行へのすべてのFK参照も「論理的に」確実にするなど、もう少し複雑なことをしたい場合があります。 論理的 参照整合性
    • を維持するために削除

このパターンを使用することを選択した場合、クライアントコードを明確にするために、 TCustomer やビューは Customer のようにテーブルに異なる名前を付けます。

ソフト削除は参照整合性を破壊し、カスタムロジックを使用してエンティティの整合性を強制する必要があるため、この種の実装には注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top