Postgresql dblink что это
Arguments
Name of the connection to use; omit this parameter to use the unnamed connection.
If true (the default when omitted) then an error thrown on the remote side of the connection causes an error to also be thrown locally. If false, the remote error is locally reported as a NOTICE, and the function returns no rows.
Return Value
The “ alias ” part of the FROM clause must specify the column names and types that the function will return. (Specifying column names in an alias is actually standard SQL syntax, but specifying column types is a PostgreSQL extension.) This allows the system to understand what * should expand to, and what proname in the WHERE clause refers to, in advance of trying to execute the function. At run time, an error will be thrown if the actual query result from the remote database does not have the same number of columns shown in the FROM clause. The column names need not match, however, and dblink does not insist on exact type matches either. It will succeed so long as the returned data strings are valid input for the column type declared in the FROM clause.
Notes
A convenient way to use dblink with predetermined queries is to create a view. This allows the column type information to be buried in the view, instead of having to spell it out in every query. For example,
Examples
Submit correction
If you see anything in the documentation that is not correct, does not match your experience with the particular feature or requires further clarification, please use this form to report a documentation issue.
Copyright © 1996-2021 The PostgreSQL Global Development Group
Автономные транзакции в PostgreSQL
Начнем с определения того, что такое автономные транзакции в принципе:
Автономные транзакции позволяют создавать новые подтранзакции (subtransaction), которые могут сохранять или отменять изменения вне зависимости от родительской транзакции. Подробнее тут.
Реализованы они в СУБД Oracle, и являются очень гибким и удобным средством. Самым популярным (но далеко не единственным) использованием автономных транзакций является логирование. Рассмотрим несложный пример. Представьте себе следующую ситуацию — в вашей БД реализована длинная и сложная хранимая процедура, например ежемесячный биллинг. Важные события вы наверняка хотели бы видеть в таблице логов. Вы, конечно, можете просто писать в нее безо всяких ухищрений. Но есть один серьезный недостаток — если в процедуре происходит необработанная ошибка — транзакция откатывается вместе со всеми записями в таблицу логов. Тут на помощь и приходят автономные транзакции. Они выполняются независимо от родительской транзакции, и вы можете увидеть записи в таблице логов еще до того, как закончилось выполнение логгируемой процедуры биллинга.
Перейдем же к теме топика. Несмотря на претенциозный заголовок, в PostgreSQL автономных транзакций не существует. Но есть способ, с помощью которого мы можем получить схожий результат.
dblink
Во-первых, нам понадобится contrib-модуль dblink. Этот модуль позволяет с помощью своих функций обращаться к другому экземпляру PostgreSQL. Подробное описание выходит за рамки топика. От себя скажу, что dblink — один из нескольких полезнейших contrib-модулей, которые я всегда устанавливаю независимо от задач, решаемых БД.
Пример
Покажу описываемый прием на примере из начала топика. Реализуем логирование на «автономных» транзакциях.
Создаем таблицу логов:
Создадим функцию для логгирования:
CREATE OR REPLACE FUNCTION » public «.»log»( IN p_source text, IN p_level text, IN p_message text)
RETURNS void AS
$$
DECLARE
INSERT_SQL text := ‘INSERT INTO public.logs (source, level, message) VALUES (‘ ‘[SOURCE]’ ‘,’ ‘[LEVEL]’ ‘,’ ‘[MESSAGE]’ ‘)’ ;
BEGIN
PERFORM dblink_exec( ‘dbname=’ || current_database(), INSERT_SQL);
END ;
$$ LANGUAGE ‘plpgsql’ ;
Теперь в любой момент мы можем вызвать функцию «log» и запись тут же появится в таблице логов независимо от статуса транзакции, в во время которой мы ее вызвали.
Как видите, весь прием состоит в том, что мы записываем в таблицу логов с помощью функции «dblink_exec». Это означает, что создается новые соединение, сессия и транзакция, в контексте которых и происходит запись.
Заметки Дебианщика
debian, linux, php, mongo, oracle, bash
Как настроить dblink в PostgreSQL
Как-то мне потребовалось настроить синхронизацию нескольких таблиц на разных серверах PostgreSQL, не настраивая при этом репликацию в классическом её виде, проанализировал я много разных вариантов и самый простой оказался синхронизация через dblink.
Настройку выполняю на Debian 7.0 (Wheezy), база данных PoetgreSQL 9.1.
Предполагаю, что база уже развёрнута и работает, а так же что у Вас есть доступ к ней с правами администратора
Через консоль базы данных создадим расширение dblink:
7 thoughts on “ Как настроить dblink в PostgreSQL ”
Да, конечно, в этом и есть основная идея DBLink.
Попробуйте «поиграть» с переменными, которые задают параметры работы с удалённой базой (это я про DBHOST DBNAME DBUSER DBPASS), Вы можете указать абсолютно любой хост, юзера, базу и т.д. Главное чтобы Вы могли подключиться к этой базе например через psql утилиту, если всё работает то и DBLink поднимется.
Так же, вы можете вместо SELECT использовать любой другой вид запроса, сгруппировать любые таблицы, или например запросить содержимое из VIEW, но в Вашем случае просто нужно вместо SELECT написать INSERT.
Для меня немного странно, что SELECT * FROM dblink (. ) AS p_u (. ); работает и выводит таблицу в консоль, а при добавлении INSERT выскакивает ошибка. Может я что-то не правильно делаю?
Спасибо.
Внимательно просмотрел, оказалось две строчки в таблицах поменяны местами.
Как подключиться к базе из запроса в PostgreSQL
Суть сегодняшнего вопроса состоит в следующем можно ли подключиться к удаленной базе непосредственно из самого запроса, т.е. во время выполнения запроса осуществить подключения к другой базе и выполнить запрос там. Ответ, можно и сегодня мы рассмотрим такую возможность на примере PostgreSQL.
Недавно мы с Вами рассматривали возможность использования межбазового запроса в MSSql 2008 – Межбазовый запрос на Transact-SQL, теперь пришло время рассмотреть такую возможность в postgresql 8.4.2-1, используя pgAdmin.
Так как мы с Вами уже рассматривали, для чего может понадобиться межбазовый запрос, поэтому, повторяться мы не будем, а перейдем сразу к делу.
Рекомендация! Ниже пересиленные действия требуют начальных знаний SQL, поэтому рекомендую ознакомиться со следующим материалом:
Подключение к базе из запроса в PostgreSQL
Для этого существует функция dblink с помощью, которой и можно осуществить задуманное.
Здесь все достаточно просто, пишете запрос select, а обращаетесь к функции dblink, в которую передаете два параметра первый строка подключения, и второй сам запрос, затем задаете псевдоним (в нашем случае это q) и в конце задаете типы данных возвращающихся полей.
Вот в принципе и все, и если нужно объединить данные разных баз, создаете представления на основе вышеприведенного примера, по каждой базе, затем через объединение union или union all объединяете все эти представления и получаете результат.
dblink
Synopsis
Description
dblink executes a query (usually a SELECT, but it can be any SQL statement that returns rows) in a remote database.
Arguments
Name of the connection to use; omit this parameter to use the unnamed connection.
The SQL query that you wish to execute in the remote database, for example select * from foo.
If true (the default when omitted) then an error thrown on the remote side of the connection causes an error to also be thrown locally. If false, the remote error is locally reported as a NOTICE, and the function returns no rows.
Return Value
The function returns the row(s) produced by the query. Since dblink can be used with any query, it is declared to return record, rather than specifying any particular set of columns. This means that you must specify the expected set of columns in the calling query — otherwise PostgreSQL would not know what to expect. Here is an example:
The «alias» part of the FROM clause must specify the column names and types that the function will return. (Specifying column names in an alias is actually standard SQL syntax, but specifying column types is a PostgreSQL extension.) This allows the system to understand what * should expand to, and what proname in the WHERE clause refers to, in advance of trying to execute the function. At run time, an error will be thrown if the actual query result from the remote database does not have the same number of columns shown in the FROM clause. The column names need not match, however, and dblink does not insist on exact type matches either. It will succeed so long as the returned data strings are valid input for the column type declared in the FROM clause.
Notes
dblink fetches the entire remote query result before returning any of it to the local system. If the query is expected to return a large number of rows, it’s better to open it as a cursor with dblink_open and then fetch a manageable number of rows at a time.
A convenient way to use dblink with predetermined queries is to create a view. This allows the column type information to be buried in the view, instead of having to spell it out in every query. For example,


