使用 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"