Сбой запроса внешней базы данных при использовании пользовательских расширений postgres - PullRequest
0 голосов
/ 25 июня 2018

Допустим, у нас есть 2 базы данных на 2 разных серверах:

В базе данныхA, создается таблица «city», эта таблица использует расширение «earthdistance»:

CREATE EXTENSION "uuid-ossp";
CREATE EXTENSION "cube"; -- required by earthdistance
CREATE EXTENSION "earthdistance";

CREATE TABLE "city" (
  "id" UUID PRIMARY KEY DEFAULT uuid_generate_v1mc(),
  "name" VARCHAR(254) DEFAULT '',
  "lat" DOUBLE PRECISION NOT NULL,
  "lon" DOUBLE PRECISION NOT NULL
);
CREATE INDEX "city_geo_idx" ON "city" USING gist(ll_to_earth(lat, lon));

INSERT INTO "city" VALUES(DEFAULT, 'Hong Kong', 22.313031, 114.170623);

В базе данных B создается внешняя ссылка на таблицу «city» таблицы из A:

CREATE EXTENSION "uuid-ossp";

CREATE EXTENSION "postgres_fdw";

CREATE SERVER "foreign_a"
  FOREIGN DATA WRAPPER "postgres_fdw"
  OPTIONS (host 'https://A.com/db', port '5432', dbname 'a');

CREATE USER MAPPING FOR "postgres"
  SERVER "foreign_a"
  OPTIONS (user 'postgres', password 'postgres');

CREATE FOREIGN TABLE "city" (
  "id" UUID,
  "name" VARCHAR(254) DEFAULT ''
)
SERVER "foreign_a"
OPTIONS (schema_name 'public', table_name 'city');

На этом этапе выполнение SELECT * FROM "city" возвращает следующую ошибку:

[2018-06-25 19:05:17] [42704] ERROR: type "earth" does not exist
[2018-06-25 19:05:17] Where: Remote SQL command: SELECT id, name FROM public.city
[2018-06-25 19:05:17] SQL function "ll_to_earth" during inlining

Добавление отсутствующих расширений в базу данных B не решает проблему:

CREATE EXTENSION "cube" SCHEMA "public";
CREATE EXTENSION "earthdistance" SCHEMA "public";

SELECT * FROM "city";

Еще раз:

[2018-06-25 19:05:58] [42704] ERROR: type "earth" does not exist
[2018-06-25 19:05:58] Where: Remote SQL command: SELECT id, name FROM public.city
[2018-06-25 19:05:58] SQL function "ll_to_earth" during inlining

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 25 июня 2018

С документация:

В удаленных сеансах, открытых postgres_fdw, для параметра search_path установлено значение pg_catalog,, так что только встроенные объектывидимый без схемы квалификации.(...) это может представлять опасность для функций, которые выполняются на удаленном сервере с помощью триггеров или правил для удаленных таблиц.

Это относится к функции ll_to_earth(), относящейся к типу earth, который не может быть найден в текущем пути поиска.К сожалению, postgres_fdw не дает вам возможности сменить удаленный search_path (похоже, это слабое место расширения).Вы можете решить эту проблему, установив расширения cube и earthdistance в pg_catalog.

-- on database A:
DROP EXTENSION cube CASCADE;
CREATE EXTENSION cube SCHEMA pg_catalog;
CREATE EXTENSION earthdistance SCHEMA pg_catalog;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...