web-dev-qa-db-ja.com

制約を削除/再作成せずにカスケード削除をOracleに強制する方法

親テーブルがあり、それを参照するドーセン子テーブルがあります。これらの子テーブルには、それらを参照する他の子テーブルがあります。等々。

メインの親テーブルから行をすべて削除する必要があります。

制約を「ON CASCADE DELETE」にするために場所全体にドロップ/再作成することはオプションではありません

それらすべてを調べて、子行を手動で削除するのは悪夢です。

他のオプションはありますか?

19
user1773602

DELETEステートメントには、カスケードするためのパラメーターがありません。

そのため、ON CASCADE DELETEまたは、適切な順序で一連の個別の削除を実行します。

テーブル構造を調査し、それに基づいて一連の削除を生成する「スマート削除」プロシージャを作成できますが、個別の削除を作成するよりも作業が多く、悪夢になります。そして、あなたはhaveがこれを機能させるための制約を持ちたいと思っていますが、これは実際には必ずしも望ましいことではありません。

27
GolezTrol

Oracleのこの種の問題を、あるブランチから別のブランチ(ターゲット)にデータをマージし、ソースブランチを削除するために意図的に行ったアプリケーションで解決しました。

https://sites.google.com/site/keytreechanger/Homehttps://sites.google.com/site/keytreechanger/Home/screenshots

引用

たとえば、このエラーが発生すると、クライアントPedrus Root(内部キー表現#R = 111)はPetrus Root(#R = 222)と同じになります。 222の下のデータを111に移動してから、222ブランチを削除します。
KTCは、データベースのすべての関連テーブルからこのケース(および解決すべき次のいくつかのケース)に関連するすべてのデータをスマートな方法で収集します。
アルゴリズムは、必要な場所で使用可能なすべてのキーコンポーネントのみを使用して検索します。
すべてのデータのバックアップは、監査目的でローカルに維持されます。ローカルリポジトリは、テーブル/フィールド定義の変更に対応するために透過的に進化します。

パワーユーザーは、テーブル/リレーションツリーを視覚的に検査し、任意のテーブルのデータを表示/印刷/編集し、オプションで推定アクション(カット、カットアンドペースト、または完了)を変更できます。
最後に、KTCは、この特定のケースを解決するための修正コードの挿入、更新、削除の数百行を生成します。
rootTableから#R = 222を削除します。
次に、ユーザーにオンラインでコードを適用します。

あなたの状況では、フィルターは削除行以外のすべての行を削除する必要があります。

知る限り、市場には同等のアプリケーションはありません。

0
Helder Velez