スキーマ全体の外部キー情報(各行:参照テーブルとフィールド、参照テーブルとフィールド)を取得できるクエリを探しています。
私はこれを見つけましたが、必要なすべての情報を提供しません: https://stackoverflow.com/questions/4389228/sql-for-Oracle-to-check-if-a-constraint-exists
私は現在それに取り組んでおり、次の数分/時間で解決策になるかもしれません。しかし、誰かがすでに完全に機能する解決策を持っている場合、私はそれを知ってうれしいです:)
テーブルのdesign tableウィンドウを開くときに Navicat ツールによって作成されたクエリに対して「リバースエンジニアリング」を行った後(外部キーに関する情報を取得するクエリはhistoryウィンドウに表示されます)、これが解決策です:
SELECT
CONS.CONSTRAINT_NAME,
CONS.TABLE_NAME,
COLS.COLUMN_NAME,
CONS.R_CONSTRAINT_NAME,
CONS_R.TABLE_NAME R_TABLE_NAME,
COLS_R.COLUMN_NAME R_COLUMN_NAME
FROM USER_CONSTRAINTS CONS
LEFT JOIN USER_CONS_COLUMNS COLS ON COLS.CONSTRAINT_NAME = CONS.CONSTRAINT_NAME
LEFT JOIN USER_CONSTRAINTS CONS_R ON CONS_R.CONSTRAINT_NAME = CONS.R_CONSTRAINT_NAME
LEFT JOIN USER_CONS_COLUMNS COLS_R ON COLS_R.CONSTRAINT_NAME = CONS.R_CONSTRAINT_NAME
-- returns only foreign key constraints
WHERE CONS.CONSTRAINT_TYPE = 'R'
ORDER BY CONS.TABLE_NAME, COLS.COLUMN_NAME
SQL Developerには、これを行うレポートが付属しています。
これはログインスキーマに対してのみ行われますが、データベース内のすべてのFKを取得できるようにするための簡単な修正です。
また、ごみ箱内のテーブルなども省略されます。
元のレポートは、データディクショナリレポートのレポートパネルにあります。
以下は、すべてのFKを取得するための修正されたクエリです。
SELECT
c.owner "Owner",
c.table_name "Table_Name",
c.constraint_name "Constraint_Name",
c.delete_rule "Delete_Rule",
d.columns,
c.r_owner "Owner of Related Table",
(
SELECT
r.table_name
FROM
sys.all_constraints r
WHERE
c.r_owner = r.owner
AND
c.r_constraint_name = r.constraint_name
) "Related Table",
c.r_constraint_name "Related Constraint"
FROM
sys.all_constraints c,
(
SELECT
a.owner,
a.table_name,
a.constraint_name,
MAX(
DECODE(position,1,substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,2,','
|| substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,3,','
|| substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,4,','
|| substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,5,','
|| substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,6,','
|| substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,7,','
|| substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,8,','
|| substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,9,','
|| substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,10,','
|| substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,11,','
|| substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,12,','
|| substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,13,','
|| substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,14,','
|| substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,15,','
|| substr(column_name,1,30),NULL)
)
|| MAX(
DECODE(position,16,','
|| substr(column_name,1,30),NULL)
) columns
FROM
sys.all_constraints a,
sys.all_cons_columns b
WHERE
a.constraint_name = b.constraint_name
AND
a.owner = b.owner
AND
a.constraint_type = 'R'
AND
substr(a.table_name,1,4) != 'BIN$'
AND
substr(a.table_name,1,3) != 'DR$'
AND (
:table_name IS NULL
OR
instr(upper(a.table_name),upper(:table_name) ) > 0
) GROUP BY
a.owner,
a.table_name,
a.constraint_name
) d
WHERE
c.owner = d.owner
AND
c.table_name = d.table_name
AND
c.constraint_name = d.constraint_name
ORDER BY
c.owner,
c.table_name,
c.constraint_name
そして、そのレポートは次のようになります。
Colsへのコメントもダンプする少し複雑なコード(Frostyコードに基づく):
SELECT
dt.table_name, dt.column_name, dt.data_type, dt.data_length,
constr.r_tbl r_table, constr.r_col r_column,
comm.comments
FROM user_col_comments comm, user_tab_columns dt
LEFT OUTER JOIN (
SELECT
cons.table_name tbl,
cols.column_name col,
cons_r.table_name r_tbl,
cols_r.column_name r_col
FROM user_constraints cons
LEFT JOIN user_cons_columns cols ON cols.constraint_name = cons.constraint_name
LEFT JOIN user_constraints cons_r ON cons_r.constraint_name = cons.r_constraint_name
LEFT JOIN user_cons_columns cols_r ON cols_r.constraint_name = cons.r_constraint_name
WHERE cons.constraint_type = 'R'
) constr ON constr.tbl = dt.table_name AND constr.col = dt.column_name
WHERE dt.table_name = comm.table_name
AND dt.column_name = comm.column_name
ORDER BY dt.table_name, dt.column_name
;
出力を読みやすくするには、break on TABLE_NAME;
in sqlplus
(私の質問を見てください https://stackoverflow.com/questions/14998296/print-only-first-unique-value-for-column-that-order-by- in-Oracle-sqlplus / )。
[〜#〜] update [〜#〜]指定されたテーブルへのFK参照を持つテーブルのリストを収集するシンプルなクエリ(クリーンアップしたい場合に便利です)テーブル名を変更した後の制約):
select * from SYS.USER_CONSTRAINTS cons
join SYS.USER_CONSTRAINTS rcons on rcons.CONSTRAINT_NAME = cons.R_CONSTRAINT_NAME
where cons.CONSTRAINT_TYPE = 'R' and rcons.TABLE_NAME 'TBL_NAME';
select * from SYS.USER_CONSTRAINTS cons
join SYS.USER_CONSTRAINTS rcons on rcons.CONSTRAINT_NAME = cons.R_CONSTRAINT_NAME
where cons.CONSTRAINT_TYPE = 'R' and rcons.TABLE_NAME like '%/_OLD' escape '/';