可以使用postgres执行跨数据库查询吗?

时间:2020-03-05 18:48:22  来源:igfitidea点击:

我将猜测答案是否基于以下错误消息(以及此Google结果),但是无论如何,是否有使用Postgres执行跨数据库查询的方法?

databaseA=# select * from databaseB.public.someTableName;
ERROR:  cross-database references are not implemented:
 "databaseB.public.someTableName"

我正在处理一些分布在两个数据库中的数据,尽管数据实际上是在两个数据库之间共享的(一个数据库中的userid列来自另一个数据库中的" users"表)。我不知道为什么这些是两个独立的数据库而不是模式,但是请放心...

解决方案

回答

在得出关于我们与跨数据库查询的相同结论之前,我已经遇到过这一问题。我最终要做的是使用模式划分表空间,这样我可以将表分组,但仍然可以查询所有表。

回答

注意:就像原始的问询者所暗示的那样,如果我们要在同一台计算机上设置两个数据库,则可能要创建两个模式,在这种情况下,我们不需要任何特殊的查询即可在它们之间进行查询。

从9.3开始更新

现在,我们可以使用新的postgres_fdw(外部数据包装器)连接到任何本地或者远程Postgres数据库中的表。

请注意,存在用于其他流行数据源的外部数据包装器。目前,只有Postgres_fdw和file_fdw是Postgres官方发行版的一部分。

9.3版之前的原始答案

该功能不是默认PostgreSQL安装的一部分,但是我们可以添加它。它称为dblink

我从未使用过它,但是它与PostgreSQL的其余部分一起维护和分发。如果我们使用的是Linux发行版随附的PostgreSQL版本,则可能需要安装一个名为postgresql-contrib的软件包。

回答

如果性能很重要并且大多数查询都是只读的,我建议将数据复制到另一个数据库。尽管这似乎是不必要的数据重复,但如果需要索引可能会有所帮助。

这可以通过简单的插入触发器来完成,该触发器依次调用dblink以更新另一个副本。也有成熟的复制选项(例如Slony),但这是不合时宜的。

回答

是的,我们可以通过使用DBlink(仅适用于postgresql)和DBI-Link(允许使用外部跨数据库查询器)和TDS_LInk来允许对MS SQL Server运行查询。

我曾经使用DB-Link和TDS-link取得了巨大的成功。

回答

仅添加更多信息。

There is no way to query a database other than the current one. Because PostgreSQL loads database-specific system catalogs, it is uncertain how a cross-database query should even behave.
  
  contrib/dblink allows cross-database queries using function calls. Of course, a client can also make simultaneous connections to different databases and merge the results on the client side.

PostgreSQL常见问题