Есть ли ярлык для использования dblink в Postgres? - PullRequest
5 голосов
/ 20 октября 2011

В 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 ]

7 голосов
/ 20 октября 2011

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

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

3 голосов
/ 20 октября 2011

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

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

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 ....;
...