dblink_connect
dblink_connect — открывает постоянное подключение к удалённой базе данных
Синтаксис
dblink_connect(text connstr) returns text dblink_connect(text connname, text connstr) returns text
Описание
Функция dblink_connect()
устанавливает подключение к удалённой базе данных Postgres Pro. Целевой сервер и база данных указываются в стандартной строке подключения libpq. Если требуется, этому подключению можно назначить имя. В один момент времени могут быть открытыми несколько именованных подключений, но только одно подключение без имени. Подключение будет сохраняться, пока не будет закрыто или до завершения сеанса базы данных.
В строке подключения также может задаваться имя существующего стороннего сервера. Для определения стороннего сервера рекомендуется использовать обёртку сторонних данных dblink_fdw
. См. пример ниже, а также CREATE SERVER и CREATE USER MAPPING.
Аргументы
connname
Имя, назначаемое этому подключению; если опускается, открывается безымянное подключение, заменяющее ранее существующее безымянное подключение.
connstr
Строка подключения в стиле libpq, например
hostaddr=127.0.0.1 port=5432 dbname=mydb user=postgres password=mypasswd options=-csearch_path=
. За подробностями обратитесь к Подразделу 31.1.1. В ней также может задаваться имя стороннего сервера.
Возвращаемое значение
Возвращает состояние (это всегда строка OK
, так как в случае любой ошибки функция прерывается, выдавая исключение).
Замечания
Если к базе данных, которая не приведена в соответствие шаблону безопасного использования схем, имеют доступ недоверенные пользователи, начинайте сеанс с удаления доступных им для записи схем из пути поиска (search_path
). Например, для этого можно добавить options=-csearch_path=
в connstr
. Это касается не только dblink
, но и любых других интерфейсов для выполнения произвольных SQL-команд.
Создавать подключения, не требующие аутентификации по паролю, с помощью dblink_connect
разрешено только суперпользователям. Если эта возможность нужна обычным пользователям, следует воспользоваться функцией dblink_connect_u
.
Использовать в именах подключений знаки «равно» не рекомендуется, так как при этом возможна путаница со строками подключений в других функциях dblink
.
Примеры
SELECT dblink_connect('dbname=postgres options=-csearch_path='); dblink_connect ---------------- OK (1 row) SELECT dblink_connect('myconn', 'dbname=postgres options=-csearch_path='); dblink_connect ---------------- OK (1 row) -- Функциональность обёртки сторонних данных (FOREIGN DATA WRAPPER) -- Замечание: чтобы это работало, для локальных подключений требуется аутентификация по паролю -- В противном случае, вызвав dblink_connect(), вы получите: -- ---------------------------------------------------------------------- -- ERROR: password is required -- DETAIL: Non-superuser cannot connect if the server does not request a password. -- HINT: Target server's authentication method must be changed. -- -- ОШИБКА: требуется пароль -- ПОДРОБНОСТИ: Обычный пользователь не может подключиться, если сервер не требует пароль. -- ПОДСКАЗКА: Необходимо изменить метод аутентификации целевого сервера. CREATE SERVER fdtest FOREIGN DATA WRAPPER dblink_fdw OPTIONS (hostaddr '127.0.0.1', dbname 'contrib_regression'); CREATE USER dblink_regression_test WITH PASSWORD 'secret'; CREATE USER MAPPING FOR dblink_regression_test SERVER fdtest OPTIONS (user 'dblink_regression_test', password 'secret'); GRANT USAGE ON FOREIGN SERVER fdtest TO dblink_regression_test; GRANT SELECT ON TABLE foo TO dblink_regression_test; \set ORIGINAL_USER :USER \c - dblink_regression_test SELECT dblink_connect('myconn', 'fdtest'); dblink_connect ---------------- OK (1 row) SELECT * FROM dblink('myconn','SELECT * FROM foo') AS t(a int, b text, c text[]); a | b | c ----+---+--------------- 0 | a | {a0,b0,c0} 1 | b | {a1,b1,c1} 2 | c | {a2,b2,c2} 3 | d | {a3,b3,c3} 4 | e | {a4,b4,c4} 5 | f | {a5,b5,c5} 6 | g | {a6,b6,c6} 7 | h | {a7,b7,c7} 8 | i | {a8,b8,c8} 9 | j | {a9,b9,c9} 10 | k | {a10,b10,c10} (11 rows) \c - :ORIGINAL_USER REVOKE USAGE ON FOREIGN SERVER fdtest FROM dblink_regression_test; REVOKE SELECT ON TABLE foo FROM dblink_regression_test; DROP USER MAPPING FOR dblink_regression_test SERVER fdtest; DROP USER dblink_regression_test; DROP SERVER fdtest;