如何使用postgres_fdw连接到本地主机?

Rad*_*ski 6 database postgresql pgadmin foreign-data-wrapper postgresql-9.3

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

CREATE SERVER app_db 
FOREIGN DATA WRAPPER postgres_fdw 
OPTIONS (dbname 'test', host 'localhost:5432');
Run Code Online (Sandbox Code Playgroud)

正如我在“查看外部数据包装器”链接中所发现的。接下来,我还将按照本教程进行操作:

CREATE USER MAPPING for postgres
SERVER app_db 
OPTIONS (user 'postgres', password 'postgres');
Run Code Online (Sandbox Code Playgroud)

(我假设用户名和密码应该与我在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')
Run Code Online (Sandbox Code Playgroud)

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

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

ERROR: could not connect to server "app_db"
SQL State: 08001
Run Code Online (Sandbox Code Playgroud)

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

Rad*_*ski 7

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

CREATE SERVER app_db 
FOREIGN DATA WRAPPER postgres_fdw 
OPTIONS (dbname 'test', port '5432', host 'localhost');
Run Code Online (Sandbox Code Playgroud)

然后:

CREATE USER MAPPING for postgres
SERVER app_db 
OPTIONS (user 'postgres', password 'postgres');
Run Code Online (Sandbox Code Playgroud)

然后:

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')
Run Code Online (Sandbox Code Playgroud)

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


Moh*_*ash 6

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

CREATE SERVER app_db
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (dbname 'test');
Run Code Online (Sandbox Code Playgroud)

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

CREATE USER MAPPING for postgres
SERVER app_db 
OPTIONS (user 'postgres');
Run Code Online (Sandbox Code Playgroud)

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

另外,出于安全原因,postgresq_fdw peer仅允许具有SUPERUSER特权的客户端进行身份验证。要允许受限用户使用FDW,您必须使用此答案中password所述的身份验证