Возможно ли до JOIN
строк из двух отдельных баз данных postgres?Объединение результатов из двух отдельных баз данных
Я работаю с системой с паролями баз данных на одном сервере, и иногда мне действительно нужна такая функция.
Возможно ли до JOIN
строк из двух отдельных баз данных postgres?Объединение результатов из двух отдельных баз данных
Я работаю с системой с паролями баз данных на одном сервере, и иногда мне действительно нужна такая функция.
Согласно http://wiki.postgresql.org/wiki/FAQ
Там нет никакого способа, чтобы запросить базу данных, отличную от текущей. Поскольку PostgreSQL загружает системные каталоги, привязанные к базе данных, это неясно, как должен вести себя запрос межбазовой базы данных. contrib/dblink позволяет выполнять запросы с использованием кросс-баз данных, используя вызовы функций. Из курса клиент также может совершать одновременные подключения к различным базам данных и объединять результаты на стороне клиента.
EDIT: 3 года спустя (март 2014), эта запись FAQ была пересмотрена, и более полезным:
Как выполнять запросы, использующие несколько баз данных?
Невозможно напрямую запросить базу данных, отличную от текущей . Поскольку PostgreSQL загружает системные каталоги, привязанные к базе данных, это неясно, как должен вести себя кросс-запрос базы данных.
Поддержка SQL/MED в PostgreSQL позволяет создать «внешнюю обертку данных» до , связывая таблицы в удаленной базе данных с локальной базой данных. Удаленная база данных может быть другой базой данных на том же экземпляре PostgreSQL или в базе данных на полпути по всему миру, это не имеет значения. postgres_fdw встроен в PostgreSQL 9.3 и включает в себя чтение/запись ; версия только для чтения для 9.2 может быть скомпилирована и установлена как модуль Contrib.
Вклад/dblink позволяет выполнять запросы с использованием кросс-баз данных с использованием вызовов функций, а доступен для более старых версий PostgreSQL. В отличие от postgres_fdw , он не может «нажимать» условия на удаленный сервер, поэтому часто требуется получить гораздо больше данных, чем вам нужно.
Конечно, клиент может также одновременно подключаться к различным базам данных и объединять результаты на стороне клиента.
Нет, вы не можете. Вы можете использовать dblink для подключения из одной базы данных к другой базе данных, но это не поможет, если вы ищете JOIN.
Вы не можете использовать разные SCHEMA в одной базе данных для хранения всех ваших данных?
Вы должны использовать DBLink ..., как araqnid упоминалось выше, что-то вроде этого работает отлично:
выберите ST.Table_Name, ST.Column_Name, DV.Table_Name, DV.Column_Name, * от information_schema.Колонки ST полное внешнее соединение DBLink ('имя_бд = otherdatabase', 'выберите table_name, column_name из INFORMATION_SCHEMA.COLUMNS') DV (table_name текст, column_name текст) на ST.Table_Name = DV.Table_name и ST.Column_Name = DV.Column_Name где ST.Column_Name является нулевым или DV.Column_Name является NULL
Да, это можно сделать с помощью dblink
хотя и с существенными соображениями производительности.
Следующий пример потребует, чтобы текущий пользователь SQL имел разрешения для обеих баз данных. Если db2
не находится в одном кластере, вам необходимо будет заменить dbname=db2
на полную строку соединения, определенную в dblink documentation.
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.
Reference take from this Article:
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.
Забудьте о dblink!
Привет Postgres_FDW:
Для подготовки удаленного доступа с помощью
postgres_fdw
:
Установите
postgres_fdw
расширение с помощьюCREATE EXTENSION
.Создайте объект внешнего сервера, используя
CREATE SERVER
, чтобы представлять каждую удаленную базу данных, к которой вы хотите подключиться. Укажите соединение информации, кроме пользователя и пароля, в качестве параметров сервера .Создайте сопоставление пользователя, используя
CREATE USER MAPPING
, для каждого пользователя базы данных, который вы хотите разрешить для доступа к каждому иностранному серверу. Укажите имя удаленного пользователя и пароль для использования в качестве параметров пользователя и пароля пользовательского сопоставления.Создайте внешний стол, используя
CREATE FOREIGN TABLE
илиIMPORT FOREIGN SCHEMA
, для каждой удаленной таблицы, к которой вы хотите получить доступ. Столбцы внешней таблицы должны соответствовать удаленной таблице, указанной в таблице.Вы можете, , однако, использовать имена таблиц и/или столбцов, отличные от таблиц удаленных компьютеров , если вы укажете правильные удаленные имена в качестве параметров внешнего табличного объекта .Теперь вам нужно только
SELECT
из внешней таблицы для доступа к данным , хранящиеся в основной удаленной таблице.
Это действительно полезно даже при больших данных.
Я не могу, у нас есть некоторые базы данных полных данных, и никто не хочет ничего менять:/Если я буду использовать этот DBLink, могу ли я сделать что-то вроде этого: INSERT INTO DB1.table SELECT * FROM DB2.table; – sennin
Вы можете это сделать, если вы выполняете запрос в db1, sth, как 'INSERT INTO db1_table (cols ...) SELECT cols ... FROM dblink ('db2', 'SELECT cols ... FROM db2_table')' – araqnid
Я использовал этот 'dblink()' для подключения этого, он работает для меня всегда – Manwal