Postgresql 使用自定义postgres扩展时,外部数据库请求失败

Postgresql 使用自定义postgres扩展时,外部数据库请求失败,postgresql,foreign-data-wrapper,Postgresql,Foreign Data Wrapper,假设我们在两台不同的服务器上有两个数据库: 一个 B关于 在数据库A上,创建了一个“城市”表,该表使用“地球距离”扩展名: CREATE EXTENSION "uuid-ossp"; CREATE EXTENSION "cube"; -- required by earthdistance CREATE EXTENSION "earthdistance"; CREATE TABLE "city" ( "id" UUID PRIMARY KEY DEFAULT uuid_generate

假设我们在两台不同的服务器上有两个数据库:

  • 一个
  • B关于
在数据库A上,创建了一个“城市”表,该表使用“地球距离”扩展名:

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上,从a中创建对表“city”的外部引用:

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*将返回以下错误:

[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
非常感谢您的帮助

来自

在postgres_fdw打开的远程会话中,
search_path
参数被设置为just
pg_catalog,
,这样在没有模式限定的情况下,只有内置对象可见。(…)这可能会对通过远程表上的触发器或规则在远程服务器上执行的函数造成危险

这适用于函数
ll_to_earth()
引用当前搜索路径上找不到的类型
earth
。不幸的是,
postgres\u fdw
没有给您机会更改远程
search\u路径(这似乎是扩展的一个弱点)。您可以通过在
pg_目录
中安装扩展插件
cube
earthdistance
来解决此问题

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

警告。不要建议在
pg_目录中安装扩展。
我个人也认为你不应该尝试
pg_目录。
另一方面,在系统目录中安装一个正式分发给Postgres的经验证的扩展不是犯罪,特别是因为我在这里没有看到替代解决方案。

非常好,这就解决了问题。很高兴知道。谢谢你,克林!