2014-01-17 3 views
1

Используя postgres_fdw, мне нужно создать внешние таблицы в указанной схеме, чтобы предотвратить столкновение имен. Чтобы изолировать проблему, которую у меня возникла, я настроил две тестовые базы постгрейсов в одном кластере, import_test и export_test. В Export_test есть таблица foreign_schema.aa. На import_test сервере, после выполнения других требований ИДП, я побежал:Почему postgres_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" 

Если я не» t сделать любую квалификацию схемы, как в:

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

И переместите таблицу aa в общедоступную схему, выбор работает просто отлично.

Если команда «SELECT id», то FROM_ local_schema. «Foreign_schema.aa» буквально запускается на удаленном сервере, очевидно, почему это не работает: local_schema. «Foreign_schema.aa» действительно не существует на удаленном сервере. По какой-то причине postgres_fdw, как представляется, добавляет имя, указанное для table_name, в схему внешней таблицы.

Мне нужно указать схему в запросе выбора, потому что, если я этого не делаю не видит внешнюю таблицу. Достижение квалификации схемы, предшествующей выбору с настройкой пути поиска, также не помогает.

Есть ли что-то, что я делаю неправильно? Если нет, существует ли обходной путь, который разрешит мне схему - присвоить внешний стол?

EDIT: Per предложений @Craig Рингера, вот самодостаточная 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" 
+1

Просьба создать автономный тестовый сценарий в виде единого сценария SQL, который может быть запущен из 'psql' и передать его в качестве отчета об ошибке в список рассылки pgsql-bugs. Ссылка на этот пост для контекста. –

+0

@CraigRinger У меня такая же проблема. Это когда-нибудь разрешалось? –

+0

Я ничего не заметил. Попробуйте http://archives.postgresql.org/ –

ответ

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.

+1

Между ОПЦИЯми должна быть запятая. – erikcw

+0

Исправлено, спасибо! – Alex

Смежные вопросы