在Postgres中使用dblink有什么捷径吗?

时间:2011-10-19 22:04:36

标签: postgresql syntax dblink cross-database

在Postgres中,您可以使用dblink链接到其他数据库,但语法非常详细。例如,你可以这样做:

SELECT *
FROM dblink (
    'dbname=name port=1234 host=host user=user password=password',
    'select * from table'
) AS users([insert each column name and its type here]);

有没有办法更快地完成这项工作?也许预先定义连接?

我注意到Postgres有一个新的create foreign table函数用于连接MySQL数据库。它的语法比dblink更简单。我能用吗?

2 个答案:

答案 0 :(得分:7)

在PostgreSQL 8.4及更高版本中,您可以使用外部数据包装器功能来定义连接参数。然后,您只需在dblink命令中引用外部服务器名称。请参阅documentation中的示例。

在PostgreSQL 9.1及更高版本中,您可以使用外部数据包装器功能来定义外部表,从而透明地访问远程数据库,而根本不使用dblink。为此,您需要获取postgresql_fdw包装器,该包装器尚未包含在任何生产版本中,但您可以在Internet上找到实验代码。实际上,这条路线更具有未来的选择。

答案 1 :(得分:3)

您可以将连接参数包装在FOREIGN SERVER object @Peter explains中,但您仍需要拼出其余参数。

您可以将所有内容封装在视图或函数中,因此只需键入一次。带函数的示例 - 以超级用户身份运行:

CREATE OR REPLACE FUNCTION f_lnk_tbl()
  RETURNS TABLE(tbl_id int, col1 text, log_ts timestamp) AS
$BODY$

SELECT *
  FROM dblink(
  'SELECT tbl_id, col1, log_ts
   FROM   tbl
   ORDER  BY tbl_id'::text) AS b(
 tbl_id int
,col1   text
,log_ts timestamp);

$BODY$ LANGUAGE sql STABLE SECURITY DEFINER;
REVOKE ALL ON FUNCTION f_lnk_tbl() FROM public;


CREATE OR REPLACE FUNCTION f_sync()
  RETURNS text AS
$BODY$

SELECT dblink_connect('hostaddr=123.123.123.123 port=5432 dbname=mydb
                       user=postgres password=*secret*');

INSERT INTO my_local_tbl SELECT * FROM f_lnk_tbl();
-- more tables?

SELECT dblink_disconnect();

$BODY$
  LANGUAGE sql VOLATILE SECURITY DEFINER;
REVOKE ALL ON FUNCTION blob.f_dbsync() FROM public;
-- GRANT ....;