170

以下のエラー メッセージ (およびこの Google の結果) に基づいて、答えは「いいえ」であると推測しますが、PostgreSQL を使用してクロスデータベース クエリを実行する方法はありますか?

databaseA=# select * from databaseB.public.someTableName;
ERROR:  cross-database references are not implemented:
 "databaseB.public.someTableName"

データは実際には 2 つのデータベース間で共有されていますが、2 つのデータベースに分割されているデータを使用しています (一方のデータベースのユーザー ID 列はusers、もう一方のデータベースのテーブルから取得されます)。これらがスキーマではなく 2 つの別個のデータベースである理由はわかりませんが、c'est la vie...

4

9 に答える 9

135

注: 元の質問者が暗示したように、同じマシンに 2 つのデータベースをセットアップしている場合、おそらく代わりに 2 つのスキーマを作成する必要があります。その場合、それらに対してクエリを実行するために特別なものは必要ありません。

postgres_fdw

(外部データ ラッパー) を使用postgres_fdwして、ローカルまたはリモートの任意の Postgres データベース内のテーブルに接続します。

他の一般的なデータ ソース用の外部データ ラッパーがあることに注意してください。現時点では、postgres_fdwとのみfile_fdwが公式の Postgres ディストリビューションの一部です。

9.3 より前の Postgres バージョンの場合

この古いバージョンはサポートされなくなりましたが、2013 年より前の Postgres インストールでこれを行う必要がある場合は、dblink.

私は一度も使用したことがありませんが、PostgreSQL の残りの部分と共に維持および配布されています。Linux ディストリビューションに付属の PostgreSQL のバージョンを使用している場合は、postgresql-contrib というパッケージをインストールする必要がある場合があります。

于 2008-09-05T18:10:20.070 に答える
24

クロスデータベースクエリについてあなたと同じ結論に達する前に、私はこれに遭遇しました。最終的には、スキーマを使用して表スペースを分割し、表をグループ化したまま、すべての表を照会できるようにしました。

于 2008-09-05T17:17:56.157 に答える
10

もう少し情報を追加するだけです。

現在のデータベース以外にクエリを実行する方法はありません。PostgreSQL はデータベース固有のシステム カタログをロードするため、クロスデータベース クエリがどのように動作するかさえ不明です。

contrib/dblink では、関数呼び出しを使用してクロスデータベース クエリを実行できます。もちろん、クライアントは異なるデータベースに同時に接続し、クライアント側で結果をマージすることもできます。

よくある質問

于 2010-05-06T21:10:59.850 に答える
5

はい、DBlink (postgresql のみ) と DBI-Link (外部クロス データベース クエリアを許可) と、MS SQL サーバーに対してクエリを実行できるようにする TDS_LInk を使用することで可能です。

私は以前に DB-Link と TDS-link を使用して大きな成功を収めました。

于 2008-09-22T05:47:10.563 に答える
3

パフォーマンスが重要で、ほとんどのクエリが読み取り専用である場合は、データを別のデータベースに複製することをお勧めします。これは不要なデータの重複のように見えますが、インデックスが必要な場合に役立つ場合があります。

これは、dblink を呼び出して別のコピーを更新する単純な on insert トリガーで実行できます。本格的なレプリケーション オプション (Slony など) もありますが、それはトピック外です。

于 2008-09-12T15:56:31.940 に答える