我在 Google SQL Cloud 中有一个带有多个数据库的 Postgres 服务器。我想在它们之间创建一个 FOREIGN DATA WRAPPER。如果我使用服务器的远程 IP 它可以工作:
CREATE SERVER "some_db_fdw" FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '34.94.1.23', dbname 'some_db');
CREATE USER MAPPING FOR some_user SERVER "some_db_fdw" OPTIONS (user 'some_user', password 'some_password');
IMPORT FOREIGN SCHEMA public LIMIT TO (my_table) FROM SERVER "some_db_fdw" INTO public;
...但如果我使用本地 IP(127.0.0.1)代替 34.94.1.23(仅限示例 IP),则会出现错误:
ERROR: password is required
DETAIL: Non-superuser cannot connect if the server does not request a password.
HINT: Target server’s authentication method must be changed.
为什么?我在用户映射中提供密码。实际上,如果我在此处省略密码,则错误将更改为:
ERROR: password is required
DETAIL: Non-superusers must provide a password in the user mapping.
所以它似乎知道它应该从用户映射中获取密码。
我不能只使用远程 IP 的原因是我们需要证书,所以如果我使用远程 IP 启用“仅允许 SSL 连接”失败,因为我在 psql 中没有证书(我在我连接的机器上有它们或者我根本无法连接,但由于此服务器位于 SQL Cloud 中,我没有任何文件系统访问权限,也无法为数据库本身提供连接到另一个数据库的证书 - 因此我尝试使用 127.0.0.1 来避免这个问题)。