CREATE SERVER xxx
FOREIGN DATA WRAPPER postgres_fdw
在 PostgreSQL 中,如果使用 dblink 访问外部服务器(Server),绝对无法完全不配置用户和密码。因为目标远程数据库必须知道"你是谁"以及"凭证是什么"才能允许你访问。
但是,如果你想在执行 dblink SQL 时不需要显式地编写和管理个人的用户密码,有以下 3 种在数据库层面"隐藏"或"免除"密码配置的官方标准做法:
方法一:配置 PUBLIC 映射(最常用:一次配置,全员免密)
你可以为系统中的 PUBLIC 角色(即所有用户)统一配置一个全局的外部服务器映射。这样,任何本地用户直接调用 dblink('your_server') 时,都不需要再为自己配置密码。
sql
-- 让所有本地用户共用同一个远程账号
CREATE USER MAPPING FOR PUBLIC
SERVER your_server_name
OPTIONS (user 'remote_user', password 'remote_password');
请谨慎使用此类代码。
- 效果 :开发人员或普通角色在写
dblink时,感知不到密码的存在,直接SELECT * FROM dblink('your_server_name', '...')即可。
方法二:使用互信认证(真正物理意义上的"无密码")
如果你的本地 PostgreSQL 服务器和远程数据库在同一个内网,且你拥有两台服务器的系统管理权限,可以通过修改 PostgreSQL 的 pg_hba.conf 配置文件来实现真正的无密码连接:
-
修改远程数据库的
pg_hba.conf:
允许本地服务器的 IP 通过trust(信任)或peer认证方式访问。text
# 示例:允许来自本地服务器 IP 的连接无需密码 host all all 192.168.1.10/32 trust请谨慎使用此类代码。
-
在本地数据库创建没有密码的 User Mapping :
因为远程已经配置了信任,所以本地创建映射时只需要写用户名,不需要写密码 :sql
CREATE USER MAPPING FOR dev SERVER your_server_name OPTIONS (user 'remote_user'); -- 这里不写 password 选项请谨慎使用此类代码。
方法三:利用连接字符串读取外部文件(如 .pgpass)
如果你不希望把密码保存在 pg_user_mapping 表中(防止被别的管理员看到),你可以让 PostgreSQL 进程去读取服务器操作系统中的密码文件:
-
在 PostgreSQL 数据库所属的系统用户(通常是
postgres)的家目录下创建.pgpass文件。 -
写入远程凭证:
hostname:port:database:username:password。 -
在本地直接通过连接字符串调用
dblink,此时不需要创建任何 User Mapping :sql
SELECT * FROM dblink('host=远程IP dbname=远程库名 user=远程用户名', 'SELECT ...') AS ...请谨慎使用此类代码。
PostgreSQL 底层的 libpq 驱动会自动去
.pgpass文件里匹配并抓取密码。
请问你是不希望在 SQL 代码里暴露密码 ,还是本地和远程是同一个数据库的两个不同 schema/不同库?
根据你的具体物理部署环境(是否在同一台机器或内网),我可以帮你推荐最安全且最省事的配置步骤。