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



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



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


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

988   6  

6 ответов:

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

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

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

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

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

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

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

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

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

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

когда задаются два текстовых аргумента, первый из них сначала просматривается как имя постоянного соединения; если найдено, команда выполняется на эта связь. Если не найден, первый аргумент рассматривается как a строка информации о подключении как для 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;

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

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

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

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

PostgreSQL FAQ

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

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

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

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

Comments

    Ничего не найдено.