2010-11-19 19 views
4

PostgreSQLでは、外部キーの使用と特定のテーブルへのアクセスに基づいて、ビュー/テーブルが依存するすべてのテーブルを取得する方法があります?PostgreSQLでビュー/テーブルが依存するテーブルのリストを取得する

基本的には、スクリプトを使用してビュー/テーブルの構造をコピーできるようにしたいが、すべてを正しく動作させるためにコピーする必要があるテーブルのリストを自動的に取得できるようにしたい。

This responseは正しい方向に向かっているように見えますが、私が期待する/期待する結果は得られません。助言がありますか?

+0

何の結果を探してるんですか? Greg Smithは、すべての依存関係を取得するために必要な内部ビューを表示します。多分あなたはそれを微調整しなければならないかもしれませんが、それだけです。 –

+0

データベース構造全体の一部の「オーバーライド」として機能する既存のデータベースにスキーマを作成して、大部分のテーブルを共有できるようにしたいのではなく、このプロセスを自動化することを望んでいました潜在的に問題にぶつかります。 Andy Lesterのコメントは、外部キーに必要な情報を得るためのpg_constraintテーブルに導かれましたが、pg_viewsとpg_rulesは、どのテーブルがルールやビューに依存しているかを把握するのに必要な情報を持っていません。 –

答えて

8

Andy Lesterの情報を使用して、私は必要な情報を取得するために次のクエリを用意することができました。

外部キーが参照表の取得:

SELECT cl2.relname AS ref_table 
FROM pg_constraint as co 
JOIN pg_class AS cl1 ON co.conrelid=cl1.oid 
JOIN pg_class AS cl2 ON co.confrelid=cl2.oid 
WHERE co.contype='f' AND cl1.relname='TABLENAME' 
ORDER BY cl2.relname; 

は、表からの眺めやルールを参照するテーブルを取得します。

SELECT cl_d.relname AS ref_table 
FROM pg_rewrite AS r 
JOIN pg_class AS cl_r ON r.ev_class=cl_r.oid 
JOIN pg_depend AS d ON r.oid=d.objid 
JOIN pg_class AS cl_d ON d.refobjid=cl_d.oid 
WHERE cl_d.relkind IN ('r','v') AND cl_r.relname='TABLENAME' 
GROUP BY cl_d.relname 
ORDER BY cl_d.relname; 
+0

ちょうど私が必要としたもの、偉大な:D – Pitt

+0

私はこれを行う方法はこれは何ですか? 'pg_rewrite'に' oid'カラムがないので、私の頭を傷つける – ekkis

+0

'oid'は[Object Identifier](https:// www)です。 .postgresql.org/docs/9.6/static/datatype-oid.html) –

2

外部キーが正しく設定されていると仮定すると、pg_dumpを使用してテーブル定義をダンプします。

pg_dump -s -t TABLENAME 
+0

私はいくつかの種類の解析が容易なものを期待していましたが、これは基本的にテーブル/ビューの作成に使用されたSQLクエリをダンプし、自動化されたスクリプトでは使いにくいものでした。 –

+1

ああ、本当に欲しいのはpg_catalogです。 http://www.postgresql.org/docs/8.4/static/catalogs.html –

+0

はい、pg_constraintはpg_classで結合されているので、私は外来キーのために欲しかったものを正確に与えました。ビューpg_rulesとpg_viewsは再構成されたSQLを提供するだけで、pg_constraintで実行できるように、参照されたテーブルを照会する方法はないようです。 –

1

非常に良いアイデアだと思います。データベース全体をコピーするだけで、アプリケーションは1つのテーブルのデータだけでなく、すべてのデータを保持したいと思います。 さらに、いくつかのテーブルに依存するトリガもありますが、それほど簡単ではないコード分析を行う必要があることを知ることができます。

+0

問題は、データベース構造全体の一部の「オーバーライド」として機能する既存のデータベースにスキーマを作成して、大部分のテーブルを共有できるようにすることです。このプロセスを自動化することを望んでいました。手作業で行う必要があり、潜在的に問題に陥る可能性があります。 –

+0

@Dave:pg_dumpを使って探検したことがありますか、それに対応したツールを作成していますか?あなたの新しい質問を見て、私はこの答えが出ていると思います。問題が述べられているだけでなく、コーナーで潜んでいる他のすべての問題もあります。それは壊れやすい解決策になるようです。 –

+0

pg_dumpでこれをどうやってやるのか説明できますか?たとえば、トリガによって自動入力された各ユーザーのAからの最新のエントリを含むテーブルAとBと、テーブルCとビューD(AとCを結合する)とE(BとCを結合する) )。 Cは大きく、スキーマに重複する必要はないので、スキーマにはA、B、D、Eだけが必要です。 pg_dumpを使用してこれらのテーブルをスキーマに移入する方法を教えてください。 –

0

psqlの場合、通常\d+を追加すると、テーブル定義とともに「参照元」リストが表示されます。

\d+ tablename 
+0

私はいくつかの種類の解析が容易なものを期待していましたが、これは基本的にはテーブル/ビューの作成に使用されたSQLクエリをダンプし、自動化されたスクリプトでは使いにくいものでした。 –

+0

正規表現を使って参照するテーブル名を解析するのは難しくありません: '^ \ s * TABLE"([^ "] *)" ' –

+0

それは本当ですが、 –

関連する問題