如果外部数据库位于同一服务器中,我可以简化postgres_fdw的使用吗?

时间:2018-05-18 15:39:44

标签: postgresql postgres-fdw pg-hba.conf

我的服务器有几个数据库。我希望能够从db2中的查询中读取db1。我知道我可以使用postgres_fdw来做,但这有一些缺点。主要的是我必须传递凭据,担心我何时更改密码等。

1 个答案:

答案 0 :(得分:1)

所以你设置服务器,用户映射和创建表:

t=# create server l foreign data wrapper postgres_fdw options (host 'localhost', dbname 't');
CREATE SERVER
t=# create user mapping FOR postgres SERVER l;
CREATE USER MAPPING
t=# create table lt(i serial);
CREATE TABLE
t=# insert into lt default values;
INSERT 0 1
t=# create foreign table ft (i int) server l options(table_name 'lt') ;
CREATE FOREIGN TABLE
t=# select * from ft;
 i
---
 1
(1 row)

现在如果我在信任本地默认连接之前将md5添加到hba,我得到:

t=# select * from ft;
ERROR:  could not connect to server "l"
DETAIL:  fe_sendauth: no password supplied

并恢复:

t=# \! sed -i '43s/host/#host/' /pg/d10/pg_hba.conf
t=# select pg_reload_conf();
 pg_reload_conf
----------------
 t
(1 row)

t=# select * from ft;
 i
---
 1
(1 row)

虽然这行是:

t=# \! sed '43,43!d' /pg/d10/pg_hba.conf
#host   all     postgres    127.0.0.1/32        md5

所以我的观点是:如果您有本地数据库,默认情况下您不需要操作密码,因为您拥有localhost的同行或信任......

<强>更新 所以为了在没有密码的情况下使用localhost你需要一行,比如:

host    fdw_db      postgres    127.0.0.1/32        trust

走在线前,如:

host    all     all 127.0.0.1/32        md5

或限制或拒绝连接的任何其他行

https://www.postgresql.org/docs/current/static/auth-pg-hba-conf.html

  

由于pg_hba.conf记录按顺序检查每个记录   连接尝试,记录的顺序是重要的。   通常,较早的记录将具有紧密的连接匹配参数   和较弱的身份验证方法,而后来的记录将有   更宽松的匹配参数和更强的认证方法。对于   例如,人们可能希望对本地TCP / IP使用信任认证   连接但需要密码才能进行远程TCP / IP连接。在   这种情况是指定连接的信任认证的记录   从127.0.0.1开始将出现在指定密码的记录之前   对更广泛的允许客户端IP地址进行身份验证。