4

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

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

例外をキャプチャしたくありません。ルールに違反するかどうかを明示的に確認したいと考えています。また、SELECT ステートメントを介して手動でチェックする必要もありません (メンテナンスの悪夢)。T-SQL でのソリューションを希望します。しかし、私は Entity Framework を使用しているので、このタスク用の API があればそれを利用することができます。

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

4

2 に答える 2

3

Ed Harperのソリューションと同様に、INSTEAD OF DELETE TRIGGERを使用することもお勧めしますが、目的の整合性チェック/ルールを適用するようにデータベースを実際に構成することを提案するという点で、ソリューションが異なります。

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

または、違反が発生しなければ、削除操作は正常に完了します。

この実装により、DBMSがデータベースの整合性を管理する全責任を確実に処理します。これはもちろん望ましいシナリオです。

わかる?

于 2009-07-23T10:57:45.500 に答える
1

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

もう 1 つのおそらくより簡単なオプションは、すべての削除に対して論理的な削除を実装し、安全に削除できるすべての論理的な削除を完全な削除に変換するスケジュールされたメンテナンス タスクを含めることです。データセットのサイズと削除の数によっては、スケジュールされたハード削除を実行しなくてもよい場合があります。

編集

John Sansom の答えは、トリガー ソリューションのより優れた実装です。

于 2009-07-23T08:36:52.837 に答える