次のような状況があります。外部キーでリンクされたメイン テーブルと他の多くのテーブル。ここで、メイン テーブルの行を削除しようとすると、ConstraintsViolation が発生しますが、これは意図的で適切です。
ここで、行削除イベントをトリガーする前に ConstraintsViolation が発生するかどうかを確認できるようにしたいと考えています。
これは可能ですか?
次のような状況があります。外部キーでリンクされたメイン テーブルと他の多くのテーブル。ここで、メイン テーブルの行を削除しようとすると、ConstraintsViolation が発生しますが、これは意図的で適切です。
ここで、行削除イベントをトリガーする前に ConstraintsViolation が発生するかどうかを確認できるようにしたいと考えています。
これは可能ですか?
これは一見良さそうに見える質問ですが、意味合いがあります。
まず第一に、これらのリレーションのステータスを読み取った後、誰もそれらを変更できないようにする必要があるため、明らかにトランザクションを使用して問題の行をロックする必要があります。
次に、誰かが後で新しい関係を追加した場合に何が起こるかについての質問をここのコメントで見るように、チェックする関係を把握する方法が必要です。そのため、スキーマを変更するたびに検出メカニズムを実行するだけで済むように、スキーマにクエリを実行するか、スキーマからこのコードを自動生成する必要があります。
さて、この試練の後、あなたが受け取る例外は本当に高価に見えますか?
If Exists ( Select * From OtherTable
Where OtherTableFKColumn = MainTablePrimaryKey)
Begin
Rollback Transaction
RaisError('Violating FK Constraint in Table [OtherTable]', 16, 1)
End
COUNT(*)
すべての関連テーブルをチェックする以外に? 私はそうは思わない。
トランザクション内で DELETE を試行し、成功した場合は ROLLBACK を強制するという厄介な試みがあります。しかし、これは私の好みでは汚いです。
すべての外部キーを2回チェックする必要があるため、このようなことを試みるのは良い考えではないと思います.1回は事前にチェックし、次にSQLを実行するときにサーバーでもう一度チェックします。パフォーマンスへの影響が深刻になる可能性があります。
ただし、これを行うことに決めた場合、最も一般的な方法は、データベースのデータ ディクショナリを使用することです。私は SQL Server のデータ ディクショナリに詳しくありませんが、他のリレーショナル データベースでは、クエリ可能なデータベース テーブルにすべてのメタデータが格納されています。テーブルを参照するすべての外部キーを見つけて、依存する行を探すクエリを動的に作成できます。