我的想法是,我有一个名为northwind
的本地数据库,而使用postgres_fdw
,我想连接到本地主机上另一个名称为test
的数据库(远程连接模拟,在我的数据库中的表更新时,在其他数据库中做一些事情,如保存到历史记录等)。所以我打开psql控制台并键入:
CREATE SERVER app_db
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (dbname 'test', host 'localhost:5432');
正如我在"查看外部数据包装器"链接中发现的那样。接下来,我还遵循教程:
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的服务器,它也不起作用。
您可以使用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仅允许具有SUPERUSER
权限的客户端进行peer
身份验证。为了允许受限制的用户使用FDW,您必须使用password
身份验证,如本答案中所述
经过多次尝试,我可能找到了一种正确的连接方式:
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')
但是,有没有一个解决方案可以检查它是否真的是"远程"连接?因为服务器在同一个本地主机上,我不知道是否可以确定。