Silverlight アプリケーションに CRUD を実装していますが、従来の方法で削除機能を実装したくありません。代わりに、データをデータベース内に非表示に設定したいと考えています。
SQL Server データベースでこれを行う方法を知っている人はいますか?
大変助かります。
Silverlight アプリケーションに CRUD を実装していますが、従来の方法で削除機能を実装したくありません。代わりに、データをデータベース内に非表示に設定したいと考えています。
SQL Server データベースでこれを行う方法を知っている人はいますか?
大変助かります。
値が 0 または 1 の「deleted」テーブルに別の列を追加し、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 = ...
ほとんどの場合、削除トリガーを使用して、削除された行をアーカイブ テーブルにアーカイブします。このようにして、誰が各行を削除したかを把握することもでき、削除された行がパフォーマンスに影響を与えることはありません。削除されたテーブルを含める場合は、両方のテーブルを結合するビューを作成できます。
トリガーを使用したソリューション
DB トリガーに詳しい方は、次のことを検討してください。
DeletedAt and DeletedBy
テーブルに列を追加するCustomer
にはCustomerView
ビューがあり、DeletedAt
nullでない行を除外します(日付列を持つgbnのアイデア)Customer
テーブルではなく、CustomerView
INSTEAD OF DELETE
行を物理的に削除するのではなく、行を削除としてマークするトリガーを
追加します。このパターンを使用することを選択した場合、クライアント コードをわかりやすくするために、おそらくテーブルTCustomer,
とビューのように異なる名前を付けるでしょう。Customer
Lukasz Lysik が示唆するように行うことができ、「削除された」行のフラグとして機能するフィールドを作成し、表示したくないときにそれらを除外できます。私は多くのアプリケーションでそれを使用しました。
別の提案として、既存のステータス コードがある場合は、追加のステータス割り当てを追加することもできます。たとえば、私たちが内部的に使用するクラス出席アプリでは、出席レコードは「インポート済み」、「登録済み」、「完了済み」、「未完了」などです* - 意図しない重複がある場合に備えて、「削除済み」オプションを追加しました. そうすれば、問題に新たなコラムを投げかけるだけでなく、記録を残すことができます。
※裏で使う数字コードの表示名です。明確にするだけです。:)
論理的な削除は参照整合性を壊し、カスタム ロジックを使用してエンティティの整合性を強化する必要があるため、この種の実装には注意してください。