Oracle SQL Developerで特定のテーブルを参照するテーブルを見つけるにはどうすればよいですか?


199

Oracle SQL Developerの私はテーブルの上に情報を表示していた場合、私は私が(表は、このテーブルによって参照されているので、と)外部キーを見てみましょう制約を、見ることができ、私は何を参照して依存関係を表示することができますパッケージなどはテーブルを参照します。しかし、どのテーブルがそのテーブルを参照しているかを見つける方法がわかりません。

たとえば、私がempテーブルを見ているとしましょう。テーブルの主キーであるを介しemp_deptempテーブルを参照する、どの部門でどの従業員が働いているかをキャプチャする別のテーブルがあります。テーブルが存在することを知らなくても、テーブルがテーブルを参照していることを(SQLではなくプログラムのUI要素を介して)見つける方法はありますか?emp_idempemp_deptempemp_dept

回答:


258

いいえ。OracleSQL Developerから利用できるそのようなオプションはありません。

手動でクエリを実行するか、他のツールを使用する必要があります(たとえば、PLSQL Developerにはそのようなオプションがあります)。次のSQLは、PLSQL開発者が使用するものです。

select table_name, constraint_name, status, owner
from all_constraints
where r_owner = :r_owner
and constraint_type = 'R'
and r_constraint_name in
 (
   select constraint_name from all_constraints
   where constraint_type in ('P', 'U')
   and table_name = :r_table_name
   and owner = :r_owner
 )
order by table_name, constraint_name

どこr_ownerスキーマで、r_table_nameあなたが参照を探していたためのテーブルです。名前は大文字と小文字が区別されます


Oracle SQL Developerの「レポート」タブには、「すべてのテーブル/依存関係」オプションがあります。これはALL_DEPENDENCIESからのものであり、「依存関係を含む、現在のユーザーがアクセスできるプロシージャ、パッケージ、関数、パッケージ本体およびトリガー間の依存関係」を指します。データベースリンクなしで作成されたビューで。」。次に、このレポートはあなたの質問に値しません。


30
答えてくれてありがとう。Oracle Sql Developerをしゃべることが恥です。
グレッグ、

1
PLSQL開発者がこの機能を実行できると述べましたが、その方法を説明できますか?
ニコラス

4
@Nicholas、オブジェクトブラウザでテーブルを選択し、テーブルを右クリックして[外部キー参照]を選択します
FerranB

3
この回答は、SQL Developer 4.1以降に、この情報をERD形式で表示する「モデル」タブのオプションがあることを示しています。
SnoringFrog 2017年

1
r_ownerは使用しているスキーマ、r_table_nameは参照を探しているテーブルです
Flowy

108

これを拡張機能としてSQL Developerに追加するには、次のようにします。

  1. 以下のコードをxmlファイル(例:fk_ref.xml)に保存します。
<items>
    <item type="editor" node="TableNode" vertical="true">
    <title><![CDATA[FK References]]></title>
    <query>
        <sql>
            <![CDATA[select a.owner,
                            a.table_name,
                            a.constraint_name,
                            a.status
                     from   all_constraints a
                     where  a.constraint_type = 'R'
                            and exists(
                               select 1
                               from   all_constraints
                               where  constraint_name=a.r_constraint_name
                                      and constraint_type in ('P', 'U')
                                      and table_name = :OBJECT_NAME
                                      and owner = :OBJECT_OWNER)
                               order by table_name, constraint_name]]>
        </sql>
    </query>
    </item>
</items>
  1. SQL Developerに拡張機能を追加します。

    • ツール>設定
    • データベース>ユーザー定義拡張機能
    • 「行を追加」ボタンをクリックします
    • タイプで「EDITOR」を選択します。場所は上記のxmlファイルを保存した場所です
    • [OK]をクリックして、SQL Developerを再起動します
  2. 任意のテーブルに移動すると、SQLタブの横に、FK参照というラベルの付いた追加のタブが表示され、新しいFK情報が表示されます。

  3. 参照


パッケージのノード名を知っていますか?Webで見つけたすべてのxsdリンクは無効になりました(Oracleで削除されたため)。
James Sumners、2012年

1
:私は小さなあなたの提案への変更を追加 し、所有者=ユーザーを 使用すると、2つのスキーマで同じテーブルの2つのインスタンスを持っている場合は、あなたのスキーマに関連する唯一の参照を取得するように、順前
user1708042

and owner = :OBJECT_OWNER前にこの条件を追加しましたand exists
Mデニス

3
@ M-Denis、この場合、他のスキーマからの参照を見逃す可能性があります。
Youw

これを適用してandを実行するdescribe books;select * from books;、Oracle SQL開発者VMの[fk参照]タブが表示されません。
mLstudent33

36

以下のクエリで[Your TABLE]をempに置き換えます

select owner,constraint_name,constraint_type,table_name,r_owner,r_constraint_name
  from all_constraints 
 where constraint_type='R'
   and r_constraint_name in (select constraint_name 
                               from all_constraints 
                              where constraint_type in ('P','U') 
                                and table_name='[YOUR TABLE]');

constraint_type in ('P','U') 制約TOTOのconstraint_typeが 'R'である場合、TOTOのr_constraint_nameはもちろん、参照されるテーブルのタイプ 'P' OR 'U'の制約の名前であるため、私は不必要だと思います。指定する必要はありません。あなたはを使用しているINので、それは多くのようでORあり、真と評価されるORの唯一のオペランドのみを気にします。
Gab是好人

10

あなたはALL_CONSTRAINTSビューからこれをクエリできるかもしれません:

SELECT table_name
FROM ALL_CONSTRAINTS
WHERE constraint_type = 'R' -- "Referential integrity"
  AND r_constraint_name IN
    ( SELECT constraint_name
      FROM ALL_CONSTRAINTS
      WHERE table_name = 'EMP'
        AND constraint_type IN ('U', 'P') -- "Unique" or "Primary key"
    );

1
外部キーは、主キーだけでなく一意キーも参照できます。また、テーブル名を複数のスキーマで使用すると、複数の一致が発生する可能性があります。「User_Constraints」ではなく「All_Constraints」を使用する場合は、「所有者」列も使用する必要があります。
マークロディ

「R」「U」「P」とは何かをコメントしてくれてありがとう
ジェフ

SQLリクエストの最後にあるセミコロンを忘れないでください。
Gab是好人

ちなみに、( 'P'、 'U')のconstraint_typeは不要です。なぜなら、制約TOTOのconstraint_typeが 'R'の場合、TOTOのr_constraint_nameは、当然、タイプ 'P' OR 'Uの制約の名前です。 '参照されるテーブル内。指定する必要はありません。
Gab是好人

9

2015年5月にリリースされたSQL Developer 4.1には、エンティティリレーションシップダイアグラム形式でテーブルを参照するテーブル外部キーを表示する[モデル]タブが追加されました。


1
何らかの理由でスクリプトでこれを必要とする場合はあまり有用ではありませんが、接続について知る必要があるだけの場合、これは現代的な方法のようです。
SnoringFrog 2017年

1
@SnoringFrogは技術的にはUI要素を要求するため、これが最も適切な答えです
WhatsThePoint

4

このようなものはどうですか:

SELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name
  FROM dba_constraints c JOIN dba_constraints c2 ON (c.r_constraint_name = c2.constraint_name)
 WHERE c.table_name = <TABLE_OF_INTEREST>
   AND c.constraint_TYPE = 'R';

2
私はからテーブル名を変更したときにこれが私のために働いたdba_constraintsためにall_constraints:とても好きSELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name FROM all_constraints c JOIN all_constraints c2 ON (c.r_constraint_name = c2.constraint_name) WHERE c.table_name = '<TABLE_OF_INTEREST>' AND c.constraint_TYPE = 'R';
chrisjleu

4
SELECT DISTINCT table_name, 
                constraint_name, 
                column_name, 
                r_table_name, 
                position, 
                constraint_type 
FROM   (SELECT uc.table_name, 
               uc.constraint_name, 
               cols.column_name, 
               (SELECT table_name 
                FROM   user_constraints 
                WHERE  constraint_name = uc.r_constraint_name) r_table_name, 
               (SELECT column_name 
                FROM   user_cons_columns 
                WHERE  constraint_name = uc.r_constraint_name 
                       AND position = cols.position)           r_column_name, 
               cols.position, 
               uc.constraint_type 
        FROM   user_constraints uc 
               inner join user_cons_columns cols 
                       ON uc.constraint_name = cols.constraint_name 
        WHERE  constraint_type != 'C') 
START WITH table_name = '&&tableName' 
           AND column_name = '&&columnName' 
CONNECT BY NOCYCLE PRIOR table_name = r_table_name 
                         AND PRIOR column_name = r_column_name; 

これは非常に便利です。このルートテーブルで選択した列の値をキーとして保持する特定のルートテーブルのすべてのテーブルを再帰的に表示します。すばらしい、ありがとう。
Ev0oD 2017

それは本当にクールです-良い仕事です。table_nameとcolumn_nameを比較するために、lower()を追加するだけです。
Tobias Otto

4

これは何年も前からありましたが、2011年にはありませんでした。

ただし、[モデル]ページをクリックするだけです。

この機能にアクセスするには、少なくともバージョン4.0(2013年にリリース)を使用していることを確認してください。

ここに画像の説明を入力してください


0

SQL開発者プラグインの上記の回答に追加するには、以下のxmlを使用すると、外部キーに関連付けられた列を取得するのに役立ちます。

    <items>
        <item type="editor" node="TableNode" vertical="true">
        <title><![CDATA[FK References]]></title>
        <query>
            <sql>
                <![CDATA[select a.owner,
                                a.constraint_name,
                                a.table_name,
                                b.column_name,
                                a.status
                         from   all_constraints a
                         join   all_cons_columns b ON b.constraint_name = a.constraint_name
                         where  a.constraint_type = 'R'
                                and exists(
                                   select 1
                                   from   all_constraints
                                   where  constraint_name=a.r_constraint_name
                                          and constraint_type in ('P', 'U')
                                          and table_name = :OBJECT_NAME
                                          and owner = :OBJECT_OWNER)
                                   order by table_name, constraint_name]]>
            </sql>
        </query>
        </item>
    </items>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.