219

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

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

4

11 に答える 11

280

いいえ。Oracle SQL Developer から利用できるオプションはありません。

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

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からのものです。データベース リンクなしで作成されたビューで。" . それでは、このレポートはあなたの質問には何の価値もありません。

于 2009-07-17T15:40:07.660 に答える
113

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

  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. SQLDeveloperに拡張機能を追加します。

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

  3. 参照

于 2011-11-22T16:34:27.207 に答える
37

以下のクエリで[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]');
于 2009-07-17T15:00:45.977 に答える
12

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"
    );
于 2009-07-17T14:56:56.310 に答える
9

2015 年 5 月にリリースされた SQL Developer 4.1 では、テーブルを参照するテーブルの外部キーをエンティティ関係図形式で表示する [モデル] タブが追加されました。

于 2015-08-10T18:14:04.833 に答える
5
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; 
于 2014-12-01T12:00:28.010 に答える
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';
于 2009-07-17T15:12:04.300 に答える
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>
于 2018-11-08T06:38:49.677 に答える