dblink_connect — 開啟到遠端資料庫的持久連線
dblink_connect(text connstr) returns text dblink_connect(text connname, text connstr) returns text
dblink_connect()
建立到遠端 PostgreSQL 資料庫的連線。要訪問的伺服器和資料庫透過標準的 libpq 連線字串來識別。可以選擇為連線指定一個名稱。可以同時開啟多個命名連線,但一次只允許一個未命名連線。連線將一直保持,直到關閉或直到資料庫會話結束。
連線字串也可以是一個現有外部伺服器的名稱。建議在定義外部伺服器時使用外部資料包裝器 dblink_fdw
。請參閱下面的示例,以及 CREATE SERVER 和 CREATE USER MAPPING。
connname
此連線使用的名稱;如果省略,將開啟一個未命名的連線,它將替換任何現有的未命名連線。
connstr
libpq 風格的連線資訊字串,例如 hostaddr=127.0.0.1 port=5432 dbname=mydb user=postgres password=mypasswd options=-csearch_path=
。詳細資訊請參閱 Section 32.1.1。或者,一個外部伺服器的名稱。
返回狀態,始終是 OK
(因為任何錯誤都會導致函式丟擲錯誤而不是返回)。
如果不受信任的使用者可以訪問未採用 安全模式使用模式 的資料庫,請在每個會話開始時從 search_path
中移除公開可寫模式。例如,可以將 options=-csearch_path=
新增到 connstr
中。這種考慮並非 dblink
特有;它適用於執行任意 SQL 命令的每個介面。
外部資料包裝器 dblink_fdw
有一個額外的布林選項 use_scram_passthrough
,它控制 dblink
是否使用 SCRAM 傳遞身份驗證連線到遠端資料庫。使用 SCRAM 傳遞身份驗證時,dblink
使用 SCRAM 加雜湊的秘密而不是明文使用者密碼連線到遠端伺服器。這避免了在 PostgreSQL 系統目錄中儲存明文使用者密碼。有關更多詳細資訊和限制,請參閱 postgres_fdw 的等效 use_scram_passthrough
選項的文件。
只有超級使用者才能使用 dblink_connect
建立不使用密碼身份驗證、SCRAM 傳遞或 GSSAPI 身份驗證的連線。如果非超級使用者需要此功能,請改用 dblink_connect_u
。
選擇包含等號的連線名稱是不明智的,因為這會與其他 dblink
函式中的連線資訊字串產生混淆的風險。
SELECT dblink_connect('dbname=postgres options=-csearch_path='); dblink_connect ---------------- OK (1 row) SELECT dblink_connect('myconn', 'dbname=postgres options=-csearch_path='); dblink_connect ---------------- OK (1 row) -- FOREIGN DATA WRAPPER functionality -- Note: local connections that don't use SCRAM pass-through require password -- authentication for this to work properly. Otherwise, you will receive -- the following error from dblink_connect(): -- 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. CREATE SERVER fdtest FOREIGN DATA WRAPPER dblink_fdw OPTIONS (hostaddr '127.0.0.1', dbname 'contrib_regression'); CREATE USER regress_dblink_user WITH PASSWORD 'secret'; CREATE USER MAPPING FOR regress_dblink_user SERVER fdtest OPTIONS (user 'regress_dblink_user', password 'secret'); GRANT USAGE ON FOREIGN SERVER fdtest TO regress_dblink_user; GRANT SELECT ON TABLE foo TO regress_dblink_user; \set ORIGINAL_USER :USER \c - regress_dblink_user SELECT dblink_connect('myconn', 'fdtest'); dblink_connect ---------------- OK (1 row) SELECT * FROM dblink('myconn', 'SELECT * FROM foo') AS t(a int, b text, c text[]); a | b | c ----+---+--------------- 0 | a | {a0,b0,c0} 1 | b | {a1,b1,c1} 2 | c | {a2,b2,c2} 3 | d | {a3,b3,c3} 4 | e | {a4,b4,c4} 5 | f | {a5,b5,c5} 6 | g | {a6,b6,c6} 7 | h | {a7,b7,c7} 8 | i | {a8,b8,c8} 9 | j | {a9,b9,c9} 10 | k | {a10,b10,c10} (11 rows) \c - :ORIGINAL_USER REVOKE USAGE ON FOREIGN SERVER fdtest FROM regress_dblink_user; REVOKE SELECT ON TABLE foo FROM regress_dblink_user; DROP USER MAPPING FOR regress_dblink_user SERVER fdtest; DROP USER regress_dblink_user; DROP SERVER fdtest;
如果您在文件中發現任何不正確之處、與您對特定功能的體驗不符之處或需要進一步闡明的地方,請使用 此表單 報告文件問題。