Возможно ли JOIN
строки из двух отдельных баз данных postgres?
Я работаю с системой с паролями баз данных на одном сервере, и иногда мне действительно нужна такая функция.
Возможно ли JOIN
строки из двух отдельных баз данных postgres?
Я работаю с системой с паролями баз данных на одном сервере, и иногда мне действительно нужна такая функция.
Согласно http://wiki.postgresql.org/wiki/FAQ
Невозможно запросить базу данных, отличную от текущей. Поскольку PostgreSQL загружает системные каталоги, относящиеся к базе данных, это неясно, как должен вести себя кросс-запрос базы данных. contrib/dblink позволяет выполнять запросы с использованием кросс-баз данных, используя вызовы функций. из Конечно, клиент может также делать одновременные подключения к различным базы данных и объединить результаты на стороне клиента.
РЕДАКТИРОВАТЬ: 3 года спустя (март 2014 года) эта запись в FAQ была пересмотрена и более полезна:
Как выполнять запросы с использованием нескольких баз данных?
Невозможно напрямую запросить базу данных, отличную от текущей один. Поскольку PostgreSQL загружает системные каталоги, относящиеся к базе данных, это неясно, как должен вести себя запрос с несколькими базами данных.
Поддержка SQL/MED в PostgreSQL позволяет "внешней обертке данных" создаваться, связывая таблицы в удаленной базе данных с локальной базой данных. Удаленная база данных может быть другой базой данных на том же PostgreSQL экземпляр или база данных на полпути по всему миру, это не имеет значения. postgres_fdw встроен в PostgreSQL 9.3 и включает чтение/запись поддержка; версия для версии 9.2 может быть скомпилирована и установлена как модуль Contrib.
contrib/dblink позволяет выполнять запросы с использованием кросс-баз данных, используя вызовы функций и доступен для более старых версий PostgreSQL. В отличие от postgres_fdw он не может "нажимать" условия на удаленный сервер, поэтому он часто приземляйтесь, получая гораздо больше данных, чем вам нужно.
Конечно, клиент может также делать одновременные подключения к различные базы данных и объединить результаты на стороне клиента.
Забудьте о dblink!
Поздороваться с Postgres_FDW:
Чтобы подготовиться к удаленному доступу с помощью
postgres_fdw
:
Установите расширение
postgres_fdw
, используяCREATE EXTENSION
.Создайте объект внешнего сервера, используя
CREATE SERVER
, чтобы представлять каждую удаленную базу данных, к которой вы хотите подключиться. Укажите соединение информации, кроме пользователя и пароля, в качестве параметров сервера объект.Создайте сопоставление пользователя, используя
CREATE USER MAPPING
, для каждого пользователя базы данных, который вы хотите разрешить для доступа к каждому иностранному серверу. Указывать имя удаленного пользователя и пароль для использования в качестве параметров пользователя и пароля отображения пользователя.Создайте внешнюю таблицу, используя
CREATE FOREIGN TABLE
илиIMPORT FOREIGN SCHEMA
, для каждой удаленной таблицы, к которой вы хотите получить доступ. Столбцы внешней таблицы должны соответствовать удаленной таблице, на которую имеется ссылка. Ты можешь, однако используйте имена таблиц и/или столбцов, отличные от удаленных table, если вы укажете правильные удаленные имена в качестве параметров внешний объект таблицы.Теперь вам нужно только
SELECT
из внешней таблицы для доступа к данным хранится в его базовой удаленной таблице.
Это действительно полезно даже при больших данных.
Нет, вы не можете. Вы можете использовать dblink для подключения из одной базы данных к другой базе данных, но это не поможет, если вы ищете JOIN.
Вы не можете использовать разные SCHEMA в одной базе данных для хранения всех ваших данных?
Вам нужно использовать dblink... как упоминалось выше в araqnid, что-то вроде этого отлично работает:
выберите ST.Table_Name, ST.Column_Name, DV.Table_Name, DV.Column_Name, * from information_schema.Columns ST полное внешнее соединение dblink ('dbname = otherdatabase', 'select Table_Name, Column_Name from information_schema.Columns ') DV (текст таблицы Table_Name, Column_Name текст) по ST.Table_Name = DV.Table_name и ST.Column_Name = DV.Column_Name где ST.Column_Name имеет значение null или DV.Column_Name имеет значение NULL
Да, это можно сделать с помощью dblink
, хотя и со значительными соображениями производительности.
В следующем примере требуется, чтобы текущий пользователь SQL имел разрешения для обеих баз данных. Если db2
не находится в одном кластере, вам необходимо заменить dbname=db2
на полную строку соединения, определенную в документации dblink..
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;
Если table2
очень велико, вы можете иметь проблемы с производительностью, потому что подзапрос загружает весь table2
перед выполнением соединения.
У вас есть расширение dblink postgresql.
Расширение DbLink PostgreSQL, которое используется для подключения одной базы данных к другой базе данных.
Установите расширение DbLink.
CREATE EXTENSION dblink;
Проверить DbLink:
SELECT pg_namespace.nspname, pg_proc.proname
FROM pg_proc, pg_namespace
WHERE pg_proc.pronamespace=pg_namespace.oid
AND pg_proc.proname LIKE '%dblink%';
Я уже подготовил полную демонстрацию по этому поводу. Посетите мой пост, чтобы узнать шаг за шагом для выполнения кросс-запроса базы данных в Postgresql.