可以使用postgres执行跨数据库查询吗?
我将猜测答案是否基于以下错误消息(以及此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常见问题