2

Oracle sys テーブルを使用して、2 つのテーブル間のパスを追跡できますか? X テーブルから Y テーブルに移動する可能性はすべてあります。問題は次のとおりです。私は巨大なデータベースで作業しており、2 つのテーブルを結合するためにどのテーブルが不可欠であるかを迅速に知ることが非常に困難です。これはできますか?

最初の必要性:

SQL Developer Data Modeler およびその他のツールの問題は、rev_eng に対してテーブルを選択する必要があることです (したがって、選択するテーブルを既に知っている必要があります) が、私にとっては、これが大きな問題です。私の場合、800 個のテーブルがあり、すべてを選択してパスを追跡することはできません。私の望みは、引数として 2 つのテーブルを送信し、可能なすべてのパスを生成することです。

2番目の必要性:

私はすでに sys.all_constraints をクエリしようとしましたが、私が行った最大のことは、テーブル X に直接接続されているテーブルを検出することです。クエリ:

SELECT C1.TABLE_NAME,C2.TABLE_NAME 
FROM ALL_CONSTRAINTS C1, ALL_CONSTRAINTS C2 
WHERE C2.CONSTRAINT_NAME = C1.R_CONSTRAINT_NAME
AND UPPER(C1.OWNER) LIKE '**MY_SCHEMA**'
AND C1.CONSTRAINT_TYPE='R' 
AND UPPER(C1.TABLE_NAME) LIKE '**X**'
ORDER BY C1.TABLE_NAME

したがって、少なくともクエリでこの結果が得られるように誰かが私を助けることができれば:

表1 | 表2 | テーブル 1 の列に参加 | JoinColumnofTable2

それを行うには、 ALL_CONSTRAINTSに結合する他のテーブルが ALL_CON_COLUMNSあると推測します が、私が見つけた問題は複合 primary_keys です。

4

3 に答える 3

3

これが、Nature が私たちにデータ モデルを与えた理由です。このようなタスクを支援するためです。

データ モデルがない場合は、データ ディクショナリからリバース エンジニアリングできます。リバース エンジニアリングに関する質問に対する私の回答をご覧ください。

リバース エンジニアリングは、外部キーによって定義された関係のみを識別できます。これについて述べる必要はありませんが、とにかく言いましょう。データベースに制約がない場合、データ モデルを自動的に導出する可能性はありません。

「800 個のテーブルがあり、すべてを選択してパスを追跡することはできません。」

うーん、データ モデルのリバース エンジニアリングを推奨することは、コークにたどり着く方法についての古いジョークのオチに少し似ていると思います。データモデルを事前に用意することの要点は、本当に必要なときにそれを用意できるということです。

于 2012-07-10T14:48:00.753 に答える
2

データベースで主キーと外部キーの関係が確立されている場合は、Oracle Developer with Data Modelerなどのツールを使用して、モデルをリバースエンジニアリングし、関係が何であるかをグラフィカルに表現できます。

このようなツールは、Oracleディクショナリを読み取って、テーブル間の関係を判別します。これは、sys.all_constraintsなどのビューをクエリすることで自分で行うことができます。

ここには10gしかないので、TimHallのGenericFunctionUsing Ref Cursorを使用して次のクエリをまとめました(11gがある場合は11gのLISTAGG関数を使用できます)。それはあなたを近づけるはずです。

SELECT ac1.table_name "Table", ac2.table_name "Referencing Table"
     , concatenate_list(CURSOR(SELECT acc.column_name 
                                 FROM all_cons_columns acc 
                                WHERE acc.constraint_name = ac1.constraint_name
                                  AND acc.owner = 'the_owner'
                                ORDER BY position)) "PK Columns"
     , concatenate_list(CURSOR(SELECT acc.column_name 
                                 FROM all_cons_columns acc 
                                WHERE acc.constraint_name = ac2.constraint_name
                                  AND acc.owner = 'the_owner'
                                ORDER BY position)) "FK Columns"
  FROM all_constraints ac1 JOIN all_constraints ac2 
                             ON ac1.constraint_name = ac2.r_constraint_name
 WHERE ac1.table_name = 'your_table'
   AND ac1.owner = 'the_owner'
   AND ac2.owner = 'the_owner'
   AND ac1.constraint_type = 'P';
于 2012-07-10T14:41:57.747 に答える
0

また、schemaspyも試してください。これは、外部キーを使用して関係モデルを生成するオープンソースの無料の代替手段です。

于 2012-07-10T14:44:09.727 に答える