Postgresql创建存储的数据库链接。

4

我知道在Oracle中可以创建储存的dblink,并在查询中使用它。例如:

创建dblink的脚本:

CREATE PUBLIC DATABASE LINK my_link CONNECT TO my_schema IDENTIFIED BY shema_password USING 'remote';

之后我们可以在查询中使用它:

SELECT * FROM some_table@my_link;

我没有找到适用于Postgres的相同解决方案。我了解到,我们可以创建命名的dblink连接:

为此,我们必须使用dblink_connect和名称参数。但是创建的命名dblink将在会话关闭后被销毁。

或者,我们可以为每个查询创建一个dblink连接:

SELECT *
FROM dblink('host= port= dbname= user= password=',
            'select table_schema, table_name from information_schema.tables where table_schema = ''data''') AS t1 (table_schema TEXT, table_name TEXT);

在Postgres中创建存储的dblink并在不同的查询中使用,这是否可能?或者我应该创建一些返回封装连接参数的dblink函数?

我尝试使用外部表并执行以下步骤:

创建postgres_fdw扩展:

CREATE EXTENSION IF NOT EXISTS postgres_fdw;

创建服务器:
CREATE SERVER my_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '-', port '-', dbname '-');

为用户'sys'创建映射,设置远程用户和密码:

CREATE USER MAPPING FOR sys SERVER light_house OPTIONS ( USER 'remote_user', PASSWORD 'remove_password');

GRANT USAGE ON FOREIGN SERVER my_server TO sys;

创建架构中的外部表:
CREATE FOREIGN TABLE system.my_local_table (
  colums ..
) SERVER my_server OPTIONS (schema_name 'remote_user', table_name 'remote_table'
);

GRANT SELECT ON TABLE system.home_measurement TO argus_sys;

之后我捕获下一个异常:
[2F003] ERROR: password is required 
Description: Non-superuser cannot connect if the server does not request a password. 
Help: Target server's authentication method must be changed.

“非超级用户如果服务器不要求密码,则无法连接” - 你真的在运行一个生产服务器,不需要密码就可以连接吗? - user330315
@a_horse_with_no_name 对不起,我不明白。 我在用户映射中声明了远程用户的密码(我更新了问题并添加了脚本),我认为这就足够了,或者我错了吗? - HAYMbl4
错误信息似乎表明您的服务器不需要密码。 - user330315
1个回答

2

你应该使用一个外部表

为了消除错误信息,需要在远程数据库服务器上更改pg_hba.conf文件,使用md5身份验证(不要忘记使用pg_ctl reload重新加载)。


我尝试创建外部表,但非超级用户无法使用它。我已更新我的问题,请查看。 - HAYMbl4
当你说“foreign server”时,你的意思是“远程数据库实例”,对吗?因此,我必须为我的“本地数据库实例”添加配置,例如:host remote_db_name remote_user_name local_ip md5 - HAYMbl4
没错,那就是我的意思。 - Laurenz Albe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接