Oracle SQL Developer では、テーブルの情報を表示している場合、制約を表示できます。これにより、外部キー(したがってこのテーブルによって参照されているテーブル)がわかります。依存関係を表示して、どのパッケージなどがテーブルを参照しているかを確認できます。しかし、どのテーブルがそのテーブルを参照しているかを見つける方法がわかりません。
たとえば、emp
テーブルを見ているとします。 emp
テーブルの主キーであるemp_dept
を介してemp
テーブルを参照する、どの部署でどの従業員が働いているかを捉える別のテーブルemp_id
があります。 emp_dept
テーブルが存在することを知らなくても、emp_dept
テーブルがemp
テーブルを参照していることを確認する方法(SQLではなく、プログラムのUI要素を通じて)はありますか?
いいえ。OracleSQL 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 tables/Dependencies」というオプションがあります。これは ALL_DEPENDENCIES で、プロシージャ、パッケージ、関数、パッケージ間の「依存関係を参照します。データベースリンクなしで作成されたビューへの依存関係を含む、現在のユーザーがアクセスできる本体とトリガー。」。それでは、このレポートはあなたの質問には意味がありません。
これを拡張機能としてSQL Developerに追加するには、次の手順に従います。
<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>
SQL Developerに拡張機能を追加します。
任意のテーブルに移動すると、FK Referencesというラベルの付いたSQLの横に追加のタブが表示され、新しいFK情報が表示されます。
参照
以下のクエリで、[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]');
2015年5月にリリースされたSQL Developer 4.1は、Entity Relationship Diagramフォーマットであなたのテーブルを参照するテーブル外部キーを示すModelタブを追加しました。
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"
);
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;
このようなものはどうですか。
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';
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>