1

我正在探索pgsql_fdw模块,我遇到了以下情况:

我有一个本地数据库,它是远程数据库的副本,但数据不同。开发与生产。我想创建一个指向生产版本的外部表。由于文档表明外部表的名称必须是唯一的,因此我决定创建一个 fdw 模式并将所有外部表放在其中。我表演了:

create foreign table foreign_table(columna bigint, columnb text)  
server foreign_server;

然而,显然 pgsql_fdw 在完全限定的表名之间使用 1 对 1 映射,当然,foreign_server 上不存在“fdw.foregin_table”,它是“public.foreign_table”,所以我得到:

ERROR:  could not execute EXPLAIN for cost estimation  
DETAIL:  ERROR:  schema "fdw" does not exist

文档中有一个用于 CREATE FOREIGN TABLE 的选项参数:

OPTIONS ( option 'value' [, ...] )  
Options to be associated with the new foreign table.  
The allowed option names and values are specific to each foreign data wrapper  
and are validated using the foreign-data wrapper's validator function.  
Option names must be unique.

我的问题是:pgsql_fdw 的选项是什么?是否有一个特定的选项来指定外部表名而不是假设远程和本地是相同的?

4

2 回答 2

2

您需要的选项是:

CREATE FOREIGN TABLE your_local_shema.your_local_table (
  field_1 int, field_2 int, ...
)
SERVER foreign_server
OPTIONS (SCHEMA_NAME 'your_remote_schema', TABLE_NAME 'your_remote_table')
于 2014-02-19T18:12:43.230 回答
1

根据要求推广我的评论解决方案以回答:

想出了如何改用 dblink contrib 模块。安装 dblink contrib 模块设置 dblink 连接:

select dblink_connect('connection_name', 'host=hostname dbname=fdbname user=user password=secret');
create foreign data wrapper dblink_fdw validator postgresql_fdw_validator;
create server dblink_fdw_server foreign data wrapper dblink_fdw options(hostaddr 'hostname', dbname 'fdbname');
select * from dblink('connection_name', 'select * from public.foreigntable') as foreign_table(columna bigint, columnb text);

参考:postgresql.org/docs/9.1/static/contrib-dblink-connect.html

于 2013-04-03T19:14:25.600 回答