如何使用 postgres_fdw 连接到本地主机?
How to connect to localhost with postgres_fdw?
我的想法是我有一个名为northwind
的本地数据库,并且postgres_fdw
我想连接本地主机上另一个名为test
的数据库(远程连接模拟,对于类似的情况当我的数据库中的 table 更新时,在其他数据库中做一些事情,比如保存到历史记录等。)。所以我打开 psql 控制台并输入:
CREATE SERVER app_db
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (dbname 'test', host 'localhost:5432');
正如我在 A Look at Foreign Data Wrappers link 中发现的那样。接下来我也跟着教程:
CREATE USER MAPPING for postgres
SERVER app_db
OPTIONS (user 'postgres', password 'postgres');
(我假设用户和密码应该与我在 Hibernate 中访问数据库时使用的用户和密码相同,并且教程中的 current_user
在我的例子中是 postgres
因为这是唯一的存在于我的 PgAdmin III 中的角色)。
然后我创建了 foreign table:
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 服务器名称时?我不能,因为它的名称带有 space (PostgreSQL 9.3),并且在创建时会导致一些奇怪的问题。先感谢您。
更新:即使我在本地主机上创建另一个名为`app_db 的服务器也不起作用。
经过多次尝试,我可能找到了正确的连接方式:
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')
但是有没有办法检查它是否真的是 "remote" 连接?因为服务器在同一个本地主机上,我不知道我是否可以确定。
您可以使用 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 仅允许对具有 SUPERUSER
权限的客户端进行 peer
身份验证。要允许受限用户使用 FDW,您必须使用 password
身份验证,如
中所述
我的想法是我有一个名为northwind
的本地数据库,并且postgres_fdw
我想连接本地主机上另一个名为test
的数据库(远程连接模拟,对于类似的情况当我的数据库中的 table 更新时,在其他数据库中做一些事情,比如保存到历史记录等。)。所以我打开 psql 控制台并输入:
CREATE SERVER app_db
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (dbname 'test', host 'localhost:5432');
正如我在 A Look at Foreign Data Wrappers link 中发现的那样。接下来我也跟着教程:
CREATE USER MAPPING for postgres
SERVER app_db
OPTIONS (user 'postgres', password 'postgres');
(我假设用户和密码应该与我在 Hibernate 中访问数据库时使用的用户和密码相同,并且教程中的 current_user
在我的例子中是 postgres
因为这是唯一的存在于我的 PgAdmin III 中的角色)。
然后我创建了 foreign table:
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 服务器名称时?我不能,因为它的名称带有 space (PostgreSQL 9.3),并且在创建时会导致一些奇怪的问题。先感谢您。
更新:即使我在本地主机上创建另一个名为`app_db 的服务器也不起作用。
经过多次尝试,我可能找到了正确的连接方式:
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')
但是有没有办法检查它是否真的是 "remote" 连接?因为服务器在同一个本地主机上,我不知道我是否可以确定。
您可以使用 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 仅允许对具有 SUPERUSER
权限的客户端进行 peer
身份验证。要允许受限用户使用 FDW,您必须使用 password
身份验证,如