1

名前の衝突を防ぐために、postgres_fdw を使用して、指定したスキーマに外部テーブルを作成する必要があります。私が抱えていた問題を特定するために、同じクラスターに import_test と export_test という 2 つのテスト用 postgres データベースをセットアップしました。Export_test には、foreign_schema.aa というテーブルがあります。サーバー import_test で、他の FDW の前提条件を実行した後、次のコマンドを実行しました。

CREATE FOREIGN TABLE local_schema.aa(
    id serial NOT NULL,
    dat text
) SERVER export_server OPTIONS (table_name 'foreign_schema.aa');

それで:

SELECT * FROM local_schema.aa;

これを行うと、次のようになります。

ERROR:  relation "local_schema.foreign_schema.aa" does not exist
CONTEXT:  Remote SQL command: SELECT id, dat FROM local_schema."foreign_schema.aa"

次のように、スキーマ修飾を行わない場合:

CREATE FOREIGN TABLE aa(
    id serial NOT NULL,
    dat text
) SERVER export_server OPTIONS (table_name 'aa');

aa テーブルを public スキーマに移動すると、select は正常に機能します。

コマンド "SELECT id, dat FROM local_schema."foreign_schema.aa" が文字通りリモート サーバーで実行されている場合、それが機能しない理由は明らかです。何らかの理由で、postgres_fdw が table_name に指定された名前の前に外部テーブルのスキーマを追加しているように見えます。

選択クエリでスキーマを指定する必要があります。そうしないと、外部テーブルが表示されないためです。選択の前に検索パスを設定してスキーマ修飾を達成しても、役に立ちません。

私が間違っていることはありますか?そうでない場合、外部テーブルをスキーマ修飾できる回避策はありますか?

編集: @Craig Ringer の提案によると、自己完結型の psql 入力は次のとおりです。

CREATE USER test_user SUPERUSER PASSWORD 'password';
SET ROLE test_user;
CREATE DATABASE import;
CREATE DATABASE export;
\c export test_user
CREATE SCHEMA export_schema;
CREATE TABLE export_schema.aa (
    id serial PRIMARY KEY,
    dat text
);
\c import test_user
CREATE EXTENSION postgres_fdw;
CREATE SERVER export_server 
    FOREIGN DATA WRAPPER postgres_fdw
    OPTIONS (host 'localhost', dbname 'export', port '5432');
CREATE USER MAPPING FOR test_user 
    SERVER export_server
    OPTIONS (user 'test_user', password 'password');
CREATE SCHEMA import_schema;        
CREATE FOREIGN TABLE import_schema.aa(
    id serial NOT NULL,
    dat text
) SERVER export_server OPTIONS (table_name 'export_schema.aa');
SELECT * FROM import_schema.aa;

次の出力が得られます。

ERROR:  relation "import_schema.export_schema.aa" does not exist
CONTEXT:  Remote SQL command: SELECT id, dat FROM import_schema."export_schema.aa"
4

1 に答える 1

3

解決策を持って戻ってくるのを忘れていました。私がバグレポートを投稿した頃に、postgres_fdw のドキュメントが更新されたことが判明しました。「F.31.1.2. オブジェクト名オプション」セクションと、次のページの schema_name オプションを参照してください: http://www.postgresql.org/docs/current/static/postgres-fdw.html。メーリングリストの返信を引用します。

 "Use: OPTIONS (schema_name 'export_schema', table_name 'aa'); above.

        Thanks,

                Stephen"

解決するには、schema_name オプション パラメータで外部スキーマ名を指定するだけです。

于 2014-03-14T21:50:20.003 に答える