首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自定义postgres扩展时,外部数据库请求失败

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

Stack Overflow用户
提问于 2018-06-25 18:20:37
回答 1查看 749关注 0票数 2

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

在数据库A上,创建了一个“城市”表,该表使用“接地距离”扩展:

代码语言:javascript
复制
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“表的外部引用:

代码语言:javascript
复制
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"将返回以下错误:

代码语言:javascript
复制
[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中添加缺少的扩展并不能解决这个问题:

代码语言:javascript
复制
CREATE EXTENSION "cube" SCHEMA "public";
CREATE EXTENSION "earthdistance" SCHEMA "public";

SELECT * FROM "city";

再一次:

代码语言:javascript
复制
[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

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-25 20:34:05

来自文件:

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

这适用于引用到当前搜索路径上找不到的类型ll_to_earth()的函数earth。不幸的是,postgres_fdw没有给您改变远程search_path的机会(它似乎是扩展的一个弱点)。您可以通过在cubeearthdistance中安装扩展pg_catalog来解决这个问题。

代码语言:javascript
复制
-- 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分发的扩展并不是犯罪,特别是因为我在这里没有看到替代的解决方案。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51029702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档