在Postgres中,是否有使用dblink的快捷方式?

5
在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个回答

8
在PostgreSQL 8.4及更高版本中,您可以使用外部数据包装器功能来定义连接参数。然后,在您的dblink命令中简单地引用外部服务器名称即可。请参阅文档中的示例。
在PostgreSQL 9.1及更高版本中,您可以使用外部数据包装器功能来定义外部表,从而透明地访问远程数据库,而无需使用dblink。为此,您需要获取postgresql_fdw包装器,它尚未包含在任何生产版本中,但您可以在互联网上找到实验性代码。实际上,这条路更多是未来的选择。

现在被称为 postgres_fdw 并包含在标准的 PostgreSQL 中。 - Peter Eisentraut

4
您可以像FOREIGN SERVER对象一样包装连接参数,就像@Peter解释的那样,但您仍然需要拼写其余部分。
您可以将所有内容封装在视图或函数中,这样您只需输入一次。以下是一个使用函数的示例-以超级用户身份运行:
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 ....;

好吧,那不是我想听到的,但我猜那就是答案。谢谢。 - Joe
抱歉,那个人给了我我真正想要的答案,但那仍然是好的信息。 - Joe
@Joe:嗯,Peter是一个Postgres开发者,他的信息应该很好!;) 我也期待FDW功能。 - Erwin Brandstetter

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