名前の衝突を防ぐために、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"