2

私は現在 SQL Server Management Studio 2005 を使用しており、少し問題に直面していますが、最初に DB スキーマの抜粋 (重要なもの) を示します。

画像へのimghackリンク

testテーブルとそれが接続されている (構成されている) すべてのものから削除したい。

問題は、DB を変更できなくなったことです (DB を使用するプログラムがすでに大きくなりすぎているため、実際には変更したくありません)。

テーブル内のエントリを削除しようとして、対応する外部キー リレーションに対してカスケード DELETE がオンになっていると、DBMS は何らかのループ (おそらくテーブルtestが原因) を検出したため、削除を実行できません。contr_tray

プログラムからエントリを手動で削除しようとすると (SqlCommandBuilderまたはcmd.ExecuteNonQuery())を使用して、次のエラーが発生します。

DELETE ステートメントが REFERENCE 制約と矛盾しています ...

トリガーを使用して、削除プロセスを下に「カスケード」する場合も同じことが起こります。

誰でもここで私を助けることができますか? ありがとうございました!

PS: また、テーブルに属するすべての列subsetが単純に NULL になる結合テーブルを作成しようとしましたが、contr_trayテーブルがレプリケート テーブルに結合され、SqlCommandBuilderこれを処理させましたが、私の SQL スキルは標準に達していないようです (つまり、私は SQL 構文を正しく理解していませんでした)[その後、必要なすべての ID の個別の値を取得することもできました ...]

どんな助けでも大歓迎です、そしてまた前もって感謝します。

4

2 に答える 2

1

SQL Serverは(迷惑なことに!)ひし形の依存関係でのONCASCADEDELETEをサポートしていません。あなたの場合、Blockは「ひし形」の下部にあるため、SQLServerは親の削除を自動的にカスケードできません。

識別関係を使用していないため、最初にトップダウンでSELECTを実行して、削除するすべてのIDを見つけてから、実際のDELETEボトムアップを実行する必要があります(プロセスでFKに違反しないようにするため)。

このロジックを一連のINSTEADOFDELETEトリガーにカプセル化できるはずです-トリガーの問題は正確には何ですか?

于 2012-07-18T17:01:00.930 に答える
0

提供するエラーは、カスケード削除とは関係ありません。外部キーによって参照されているため、行を削除できないことを示しています。これは、テストからウェルまで、その間のすべての関係を含めて、カスケード削除がない場合に発生します。

これがあなたが期待していた答えではない場合は、各テーブル間の関係がどのように設定されているかについての詳細情報が必要です。

于 2012-07-18T16:31:04.477 に答える