Возможно выполнение запросов между базами данных с помощью postgres?

Я собираюсь догадаться, что ответ не основан на приведенном ниже сообщении об ошибке (и этот результат Google), но есть ли в любом случае выполнить запрос кросс-базы данных с помощью Postgres?

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

Я работаю с некоторыми данными, которые разделены между двумя базами данных, хотя данные действительно разделяются между двумя (столбцы userid в одной базе данных поступают из users таблица в другой базе). Я понятия не имею, почему это две отдельные базы данных вместо схемы, но СЕ ЛЯ ВИ...

6 ответов


Примечание: как подразумевал оригинальный asker, если вы настраиваете две базы данных на одном компьютере, вы, вероятно, хотите сделать два - схемы вместо этого - в этом случае вам не нужно ничего особенного для запроса через них.

обновление с 9.3

теперь вы можете использовать новый тег postgres_fdw (внешняя оболочка данных) для подключения к таблицам в любой базе данных Postgres - локальной или удаленной.

обратите внимание, что есть внешняя обертки данных для других популярных источников данных. В это время, только postgres_fdw и file_fdw являются частью официального распределения Postgres.

оригинальный ответ для pre-9.3

эта функция не является частью установки PostgreSQL по умолчанию,но вы можете добавить ее. Это называется dblink.

Я никогда не использовал его, но он поддерживается и распространяется с остальной частью PostgreSQL. Если вы используете версию PostgreSQL, которая поставляется вместе с вашим Дистрибутив Linux, вам может потребоваться установить пакет под названием postgresql-contrib.


Я столкнулся с этим, прежде чем пришел к тому же выводу о перекрестных запросах базы данных, что и вы. В конечном итоге я использовал схемы для разделения табличного пространства таким образом, чтобы я мог группировать таблицы, но все равно запрашивать их все.


dblink успешно() -- выполняет запрос в удаленной базе данных

dblink выполняет запрос (обычно SELECT, но это может быть любой SQL оператор, возвращающий строки) в удаленной базе данных.

когда даются два текстовых аргумента, первый из них сначала просматривается как имя постоянного соединения; если найдено, команда выполняется на эта связь. Если не найден, первый аргумент рассматривается как строка сведений о соединении как для dblink_connect, и указанное соединение производится только на время выполнения этой команды.

хороший пример:

SELECT * 
FROM   table1 tb1 
LEFT   JOIN (
   SELECT *
   FROM   dblink('dbname=db2','SELECT id, code FROM table2')
   AS     tb2(id int, code text);
) AS tb2 ON tb2.column = tb1.column;

примечание: Я даю эту информацию для дальнейшего использования. эталонная


просто добавить немного больше информации.

нет никакого способа запросить базу данных, кроме текущей. Поскольку PostgreSQL загружает системные каталоги для конкретной базы данных, неизвестно, как должен вести себя запрос между базами данных.

contrib / dblink позволяет выполнять запросы между базами данных с помощью вызовов функций. Конечно, клиент также может одновременно подключаться к различным базам данных и объединять результаты на стороне клиента.

PostgreSQL FAQ


Да, вы можете использовать DBlink (только postgresql) и DBI-Link (позволяет запрашивать внешние перекрестные базы данных) и TDS_LInk, который позволяет запускать запросы против MS SQL server.

Я использовал DB-Link и TDS-link раньше с большим успехом.


Если производительность важна, и большинство запросов доступны только для чтения, я бы предложил реплицировать данные в другую базу данных. Хотя это кажется ненужным дублированием данных, это может помочь, если требуются индексы.

Это можно сделать с помощью простых триггеров вставки, которые, в свою очередь, вызывают dblink для обновления другой копии. Есть также полномасштабные варианты репликации (например, Slony), но это не по теме.