2017-01-23 178 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

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