postgresql - other - postgres db link does not exist
¿Hay algún atajo para usar dblink en Postgres? (2)
En Postgres, puede vincular a sus otras bases de datos usando dblink
, pero la sintaxis es muy detallada. Por ejemplo, puedes hacer:
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]);
¿Hay alguna manera de hacer esto más rápido? Tal vez predefinir las conexiones?
Me di cuenta de que Postgres tiene una nueva función create foreign table
para conectarse a una base de datos MySQL. Tiene una sintaxis más simple que dblink
. ¿Podría usar eso?
En PostgreSQL 8.4 y posterior, puede usar la funcionalidad de contenedor externo de datos para definir los parámetros de conexión. Entonces simplemente se referiría al nombre del servidor extranjero en sus comandos de dblink. Ver el ejemplo en la documentación .
En PostgreSQL 9.1 y posterior, puede utilizar la funcionalidad de contenedor externo de datos para definir tablas extrañas y así acceder a las bases de datos remotas de forma transparente, sin utilizar ningún tipo de dblink. Para eso, necesitaría obtener el contenedor postgresql_fdw
, que aún no está incluido en ninguna versión de producción, pero puede encontrar un código experimental en Internet. En la práctica, esta ruta es más una opción futura.
Puede ajustar los parámetros de conexión en un objeto FOREIGN SERVER
como lo explica @Peter , pero aún tendría que deletrear el resto.
Puede encapsular todo en una vista o función, por lo que debe escribirlo solo una vez. Ejemplo con una función - Ejecutar como superusuario:
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 ....;