7

这个想法是我有一个名为 的本地数据库northwind,并且postgres_fdw我想连接另一个名为testlocalhost 的数据库(远程连接模拟,例如当我的数据库中的表被更新时,在其他数据库中执行某些操作,例如保存到历史记录等。 )。所以我打开 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')

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

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

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

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

4

2 回答 2

9

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

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')

但是有没有办法检查它是否真的是“远程”连接?因为服务器在同一个本地主机上,我不知道我是否可以确定。

于 2015-04-27T16:58:32.590 回答
9

您可以使用 Unix 域套接字而不是 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,您必须使用此答案password中描述的身份验证

于 2016-08-31T22:27:23.733 回答