Используя postgres_fdw, мне нужно создать сторонние таблицы в указанной схеме, чтобы предотвратить конфликты имен. Чтобы изолировать возникшую у меня проблему, я установил две тестовые базы данных postgres в одном кластере, import_test и export_test. 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 в общедоступную схему, выбор работает нормально.
Если команда "SELECT id, dat FROM local_schema." Foreign_schema.aa "буквально выполняется на удаленном сервере, очевидно, почему она не работает: 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"
psql
, и отправьте его как отчет об ошибке в список рассылки pgsql-bugs. Ссылка на этот пост для контекста. - person Craig Ringer   schedule 18.01.2014