为什么postgres_fdw是双重限定模式?

时间:2014-01-17 18:53:42

标签: postgresql postgresql-9.3 foreign-data-wrapper

使用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指定的名称前面加上外表的模式。

我需要在select查询中指定架构,因为如果我不这样做,它就看不到外表。通过在选择之前设置搜索路径来实现模式资格认证也无济于事。

我做错了什么吗?如果没有,是否有一种解决方法可以让我对外表进行架构限定?

编辑:根据@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"

1 个答案:

答案 0 :(得分: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选项参数中指定外部模式名称即可。