Есть ли ярлык для использования dblink в Postgres?

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

SELECT *
FROM dblink (
    'dbname=name port=1234 host=host user=user password=password',
    'select * from table'
) AS users([insert each column name and its type here]);

Есть ли способ сделать это быстрее? Может быть, заранее определить связи?

Я заметил, что у Postgres есть новый create foreign table функция для подключения к базе данных MySQL. Он имеет более простой синтаксис, чем dblink, Могу ли я использовать это?

2 ответа

Решение

В PostgreSQL 8.4 и более поздних версиях вы можете использовать функцию обёртки сторонних данных для определения параметров соединения. Тогда вы просто будете ссылаться на имя внешнего сервера в ваших командах dblink. Смотрите пример в документации.

В PostgreSQL 9.1 и более поздних версиях вы можете использовать функциональность обёртки сторонних данных для определения сторонних таблиц и, таким образом, прозрачного доступа к удаленным базам данных без использования dblink. Для этого вам нужно получить postgresql_fdw обертка, которая еще не включена ни в один производственный выпуск, но вы можете найти экспериментальный код в Интернете. На практике этот маршрут является более перспективным вариантом.

Вы можете обернуть параметры подключения в FOREIGN SERVER объект, как объясняет @Peter, но вам все равно придется разобрать все остальное.

Вы можете инкапсулировать все в представлении или функции, поэтому вы вводите это только один раз. Пример с функцией - Запуск от имени суперпользователя:

CREATE OR REPLACE FUNCTION f_lnk_tbl()
  RETURNS TABLE(tbl_id int, col1 text, log_ts timestamp) AS
$BODY$

SELECT *
  FROM dblink(
  'SELECT tbl_id, col1, log_ts
   FROM   tbl
   ORDER  BY tbl_id'::text) AS b(
 tbl_id int
,col1   text
,log_ts timestamp);

$BODY$ LANGUAGE sql STABLE SECURITY DEFINER;
REVOKE ALL ON FUNCTION f_lnk_tbl() FROM public;


CREATE OR REPLACE FUNCTION f_sync()
  RETURNS text AS
$BODY$

SELECT dblink_connect('hostaddr=123.123.123.123 port=5432 dbname=mydb
                       user=postgres password=*secret*');

INSERT INTO my_local_tbl SELECT * FROM f_lnk_tbl();
-- more tables?

SELECT dblink_disconnect();

$BODY$
  LANGUAGE sql VOLATILE SECURITY DEFINER;
REVOKE ALL ON FUNCTION blob.f_dbsync() FROM public;
-- GRANT ....;
Другие вопросы по тегам