2009-07-22 11 views
3

SQL Server 2005データベース内のいくつかのエンティティに対して「ソフト削除」スキームを実装したいと考えています。これにより、参照整合性ルール違反がない場合は、テーブルから行を削除することを意味します。そうでなければ、削除されたことを示すフラグをレコードに設定します。この「ソフト削除」パターンを適用したい表では、「挿入/更新の仕様」として「アクションなし」が適用されている必要があります。レコードを削除する前にルール違反を確認する

実行したい削除が外部キー制約に違反するかどうかを確認するにはどうすればよいですか?

私は例外を捕捉したくありません - ルールが違反されるかどうかを明示的にチェックしたいと思います。私はまた、SELECTステートメント(メンテナンスの悪夢)を介して手動でチェックする必要はありません。私はT-SQLのソリューションを好むだろう。私はEntity Frameworkを使用していますので、このタスクが存在する場合はAPIを利用することができます。

同様の質問がhereと記載されていますが、提示された回答が私の要件に合わないことに注意してください。

答えて

2

Ed Harperのソリューションと同様に、私はあなたにはDELETE TRIGGERを使用することをお勧めします。しかし、私たちはあなたが実際にデータベースを構成して、望ましい整合性チェック/ルールを適用することを提案します。

このように、制約違反のためにトリガーコード内で削除操作が正常に完了できない場合は、実際に削除するのではなく、そのレコードにマーク(「ソフト削除」)を付けることができます。

また、違反が発生しない場合でも、削除操作は正常に完了します。

この実装では、DBMSがデータベースの完全性を管理する責任をすべて負うことが保証されていますが、もちろんこれは望ましいシナリオです。

意味がありますか?

1

対象テーブルでINSTEAD OF DELETEトリガーを使用して、選択ステートメントを実行してFK違反がないかどうかを確認してから、削除がない場合は削除を実行できます。これにより、データベース内のすべてのロジックをカプセル化できますが、削除、大量のデータセット、または多数の外部キーがあるとパフォーマンスが問題になる可能性があります。これが許容できない保守上の問題を引き起こしていると感じる場合は、手作業ですべてをコーディングするのではなく、データベースメタデータを使用して必要なクエリを動的に構築する汎用コードを記述することは可能です。

もう1つのオプションは、すべての削除に対してソフト削除を実装してから、安全に削除できるすべてのソフト削除をハード削除に変換するスケジュールされたメンテナンスタスクを含めることです。データセットのサイズおよび削除の数に応じて、スケジュールされたハード削除を実行しないでください。

EDIT

ジョン・サンソムの答えは、トリガー溶液のより高度な実装です。

関連する問題