Почему postgres_fdw соответствует схемам с двойной квалификацией?

Используя 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"

person Alex    schedule 17.01.2014    source источник
comment
Создайте автономный тестовый пример в виде одного сценария SQL, который можно запустить из psql, и отправьте его как отчет об ошибке в список рассылки pgsql-bugs. Ссылка на этот пост для контекста.   -  person Craig Ringer    schedule 18.01.2014
comment
@CraigRinger У меня такая же проблема. Это когда-нибудь решалось?   -  person David S    schedule 14.03.2014
comment
Я ничего не заметил. Попробуйте archives.postgresql.org   -  person Craig Ringer    schedule 14.03.2014
comment
@DavidS Смотрите мой ответ.   -  person Alex    schedule 15.03.2014


Ответы (1)


Забыл вернуться с разрешением. Оказывается, примерно в то время, когда я опубликовал отчет об ошибке, документы на 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.

person Alex    schedule 14.03.2014
comment
Между ОПЦИЯМИ должна быть запятая. - person erikcw; 19.11.2014