dblink_connect - функция открытия соединения с внешней базой данных
Синтаксис
Описание
dblink_connect устанавливает соединение с внешней базой данных PostgreSQL. Связь организуется через стандартную библиотеку libpq с соответсвующим синтаксисом. Если используется несколько подключений к внешним серверам, то каждому соединению можно назначить имя, так как одновременно поддерживается только одно неименованное соединение. Связь сохраняется в пределах сессии или до принудительного остоединения (dblink_disconnect).
(для версии 8.4) Конструкция соединения так же может быть именем существующего внешнего сервера заведенного в базе данных. Для внешних серверов рекомендуется использовать обертку postgresql_fdw_validator.
Аргументы
имя соединения - необязательный текстовый параметр который именует создаваемое соединение.
строка соединения - обязательный текстовый параметр, строка соединения в стиле libpq например: 'hostaddr=127.0.0.1 port=5432 dbname=mydb user=postgres password=mypasswd'. Так же может быть именем внешнего сервера.
Возвращаемые данные
Всегда возвращает 'OK' в тексте, если же во время соединения возникла ошибка, то возвращает ошибку и безусловно прерывает выполнение функции(!).
Примечание
Только пользователь с привилегией SUPER может открывать соединения, если у пользователя такой привилегии нет, то можно импользовать функцию dblink_connect_u.
Если мы открываем именованное соединение, то перед этой операцией желательно проверить нет ли соединений с таким же имененем с помощью dblink_get_connections, так как в противном случае мы получим ошибку. Для неименованного соединения этой проблемы нет, мы може открывает его несколько раз подряд.
Следует быть внимательным при установке подключений "на лету" внутри функций, так как ошибка подключения безусловно останавливает выполнение пользовательской функции. Но ошибка возвращается стандартная для PostgreSQL (код: 08001), поэтому можно создать процедуру подключения к удаленной базе и повесить на неё EXEPTION, например так:
Неправильно использовать имена соединения с вимволом "=", так как в некоторых функциях dblink может посчитать, что это не имя соединения, а другое выражение.