2017-01-23 192 views
0

我知道在Oracle中可以创建存储的数据库链接,然后在查询中使用它。例如:Postgresql创建存储数据库链接

脚本创造DBLINK:

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

而在这之后,我们可以在我们的查询中使用它:

SELECT * FROM [email protected]_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. 
+0

“*如果服务器不请求密码,非超级用户无法连接*” - 您诚实地运行不需要密码连接的生产服务器? –

+0

@a_horse_with_no_name对不起,但我不忍心。我在用户映射中向远程用户声明了passord(我更新了问题并添加了脚本),而且我已经足够了,或者我错了? – HAYMbl4

+0

错误消息似乎表明您的服务器没有_require_密码。 –

回答

2

你应该使用foreign table

为了摆脱的错误消息,更改远程数据库服务器上的文件pg_hba.conf使用md5认证(不要忘记pg_ctl reload重新加载)。

+0

我尝试创建外部表,但不能与非超级用户一起使用。我更新了我的问题,请看看它。 – HAYMbl4

+0

当你说:“外部服务器”你的意思是“远程数据库实例”,对不对?在那里,我必须为我的“本地数据库实例”添加配置,例如:'host remote_db_name remote_user_name \t local_ip md5' – HAYMbl4

+0

好的,这就是我的意思。 –