如何使用postgres_fdw连接到localhost?

时间:2015-04-27 16:06:55

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

我的想法是我有一个名为northwind的本地数据库,并且postgres_fdw我希望在localhost上连接另一个名为test的数据库(远程连接模拟,适用于表格时)在我的数据库中更新,在其他数据库中执行某些操作,如保存到历史记录等。)。所以我打开psql控制台并输入:

CREATE SERVER app_db 
FOREIGN DATA WRAPPER postgres_fdw 
OPTIONS (dbname 'test', host 'localhost:5432');

正如我在A Look at Foreign Data Wrappers链接中找到的那样。接下来我也按照教程:

CREATE USER MAPPING for postgres
SERVER app_db 
OPTIONS (user 'postgres', password 'postgres');

(我假设用户和密码应该与我在Hibernate中用来访问数据库时相同,并且在我的情况下,current_user来自教程的postgres因为这是唯一的角色存在于我的PgAdmin III中。 然后我创建了外表:

CREATE FOREIGN TABLE groups
(
  id serial NOT NULL,
  name character varying(255) NOT NULL,
  version integer DEFAULT 0
)
 SERVER app_db OPTIONS (table_name 'groups')

没关系,我可以在PgAdmin III的schema/foreign tables中找到它。但是当我尝试SELECT * FROM groups时,我得到了:

********** ERROR**********

ERROR: could not connect to server "app_db"
SQL State: 08001

是否可能因为我CREATE SERVER app_db..时我不使用localhost服务器名称?我不能,因为它有空间名称(PostgreSQL 9.3),它在创建时会引起一些奇怪的问题。先感谢您。 更新:即使我在localhost上创建另一个名为`app_db的服务器,它也不起作用。

2 个答案:

答案 0 :(得分:6)

您可以使用Unix Domain Socket而不是TCP连接进行连接,以获得更简单的配置和更好的性能(仅限Linux / Unix,Windows不支持)。

CREATE SERVER app_db
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (dbname 'test');

此外,如果启用peer身份验证(默认),则可以省略密码。

CREATE USER MAPPING for postgres
SERVER app_db 
OPTIONS (user 'postgres');

注意: peer身份验证只能用于postgres用户,因为FDW连接是由作为系统用户postgres运行的服务器后端创建的。

此外,出于安全原因,postgresq_fdw仅对具有peer权限的客户端进行SUPERUSER身份验证。要允许受限用户使用FDW,您必须使用this answer

中所述的password身份验证

答案 1 :(得分:5)

经过多次尝试,我找到了一种正确的连接方式:

CREATE SERVER app_db 
FOREIGN DATA WRAPPER postgres_fdw 
OPTIONS (dbname 'test', port '5432', host 'localhost');

然后:

CREATE USER MAPPING for postgres
SERVER app_db 
OPTIONS (user 'postgres', password 'postgres');

然后:

CREATE FOREIGN TABLE groups
(
  id serial NOT NULL,
  name character varying(255) NOT NULL,
  version integer DEFAULT 0
)
 SERVER app_db OPTIONS (schema_name 'public', table_name 'groups')

但是有没有一个解决方案来检查它是否真的"远程"连接?因为服务器位于同一个本地主机上,我不知道我是否可以确定。