Есть ли ярлык для использования 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 ....;