2011-01-13 4 views

ответ

42

Согласно 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 , он не может «нажимать» условия на удаленный сервер, поэтому часто требуется получить гораздо больше данных, чем вам нужно.

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

6

Нет, вы не можете. Вы можете использовать dblink для подключения из одной базы данных к другой базе данных, но это не поможет, если вы ищете JOIN.

Вы не можете использовать разные SCHEMA в одной базе данных для хранения всех ваших данных?

+0

Я не могу, у нас есть некоторые базы данных полных данных, и никто не хочет ничего менять:/Если я буду использовать этот DBLink, могу ли я сделать что-то вроде этого: INSERT INTO DB1.table SELECT * FROM DB2.table; – sennin

+7

Вы можете это сделать, если вы выполняете запрос в db1, sth, как 'INSERT INTO db1_table (cols ...) SELECT cols ... FROM dblink ('db2', 'SELECT cols ... FROM db2_table')' – araqnid

+1

Я использовал этот 'dblink()' для подключения этого, он работает для меня всегда – Manwal

4

Вы должны использовать 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

4

Да, это можно сделать с помощью 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 перед выполнением соединения.

2

У вас есть расширение 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.

+0

Хороший улов. Не все знают, что вам нужно, чтобы расширение было активным. – Stradas

+0

Спасибо Страдасу! – Anvesh

10

Забудьте о dblink!

Привет Postgres_FDW:

Для подготовки удаленного доступа с помощью postgres_fdw:

  1. Установите postgres_fdw расширение с помощью CREATE EXTENSION.

  2. Создайте объект внешнего сервера, используя CREATE SERVER, чтобы представлять каждую удаленную базу данных, к которой вы хотите подключиться. Укажите соединение информации, кроме пользователя и пароля, в качестве параметров сервера .

  3. Создайте сопоставление пользователя, используя CREATE USER MAPPING, для каждого пользователя базы данных, который вы хотите разрешить для доступа к каждому иностранному серверу. Укажите имя удаленного пользователя и пароль для использования в качестве параметров пользователя и пароля пользовательского сопоставления.

  4. Создайте внешний стол, используя CREATE FOREIGN TABLE или IMPORT FOREIGN SCHEMA, для каждой удаленной таблицы, к которой вы хотите получить доступ. Столбцы внешней таблицы должны соответствовать удаленной таблице, указанной в таблице.Вы можете, , однако, использовать имена таблиц и/или столбцов, отличные от таблиц удаленных компьютеров , если вы укажете правильные удаленные имена в качестве параметров внешнего табличного объекта .

Теперь вам нужно только SELECT из внешней таблицы для доступа к данным , хранящиеся в основной удаленной таблице.

Это действительно полезно даже при больших данных.

Смежные вопросы