Pregunta

Voy a suponer que la respuesta es "no" según el siguiente mensaje de error (y este resultado de Google), pero ¿hay alguna forma de realizar una consulta entre bases de datos utilizando PostgreSQL?

databaseA=# select * from databaseB.public.someTableName;
ERROR:  cross-database references are not implemented:
 "databaseB.public.someTableName"

Estoy trabajando con algunos datos que están divididos en dos bases de datos, aunque los datos en realidad se comparten entre las dos (las columnas de ID de usuario en una base de datos provienen del users tabla en la otra base de datos).No tengo idea de por qué son dos bases de datos separadas en lugar de un esquema, pero c'est la vie...

¿Fue útil?

Solución

Nota:Como dio a entender el autor de la pregunta original, si está configurando dos bases de datos en la misma máquina, probablemente desee crear dos esquemas en su lugar, en ese caso no necesita nada especial para consultarlos.

Actualización a partir de 9.3

Ahora puedes usar el nuevo postgres_fdw (contenedor de datos externos) para conectarse a tablas en cualquier base de datos de Postgres, local o remota.

Tenga en cuenta que hay contenedores de datos extranjeros para otras fuentes de datos populares.En este momento, sólo postgres_fdw y file_fdw son parte de la distribución oficial de Postgres.

Respuesta original para versiones anteriores a 9.3

Esta funcionalidad no forma parte de la instalación predeterminada de PostgreSQL, pero puede agregarla.Se llama dblink.

Nunca lo he usado, pero se mantiene y distribuye con el resto de PostgreSQL.Si está utilizando la versión de PostgreSQL que viene con su distribución de Linux, es posible que necesite instalar un paquete llamado postgresql-contrib.

Otros consejos

Me encontré con esto antes y llegué a la misma conclusión que usted sobre las consultas entre bases de datos.Lo que terminé haciendo fue usar esquemas para dividir el espacio de la tabla de esa manera podía mantener las tablas agrupadas pero aún así consultarlas todas.

enlace db() -- ejecuta una consulta en una base de datos remota

Dblink ejecuta una consulta (generalmente una selección, pero puede ser cualquier declaración SQL que devuelva filas) en una base de datos remota.

Cuando se dan dos argumentos de texto, el primero se ve por primera vez como el nombre de una conexión persistente;Si se encuentra, el comando se ejecuta en esa conexión.Si no se encuentra, el primer argumento se trata como una cadena de información de conexión como para dblink_connect, y la conexión indicada se realiza solo para la duración de este comando.

uno de los buenos ejemplos:

SELECT * 
FROM   table1 tb1 
LEFT   JOIN (
   SELECT *
   FROM   dblink('dbname=db2','SELECT id, code FROM table2')
   AS     tb2(id int, code text);
) AS tb2 ON tb2.column = tb1.column;

Nota:Doy esta información para referencia futura. Referencia

Sólo para agregar un poco más de información.

No hay forma de consultar una base de datos distinta a la actual.Debido a que PostgreSQL carga catálogos de sistemas específicos de bases de datos, no está claro cómo debería comportarse una consulta entre bases de datos.

contrib/dblink permite consultas entre bases de datos mediante llamadas a funciones.Por supuesto, un cliente también puede realizar conexiones simultáneas a diferentes bases de datos y fusionar los resultados en el lado del cliente.

Preguntas frecuentes sobre PostgreSQL

Sí, puede hacerlo utilizando DBlink (solo postgresql) y DBI-Link (permite consultas de bases de datos cruzadas externas) y TDS_LInk, que permite ejecutar consultas en el servidor MS SQL.

He utilizado DB-Link y TDS-link antes con gran éxito.

Si el rendimiento es importante y la mayoría de las consultas son de solo lectura, sugeriría replicar los datos en otra base de datos.Si bien esto parece una duplicación innecesaria de datos, podría ser útil si se requieren índices.

Esto se puede hacer con activadores de inserción simples que a su vez llaman a dblink para actualizar otra copia.También hay opciones de replicación completas (como Slony), pero eso está fuera de tema.

En caso de que alguien necesite un ejemplo más complicado sobre cómo realizar consultas entre bases de datos, aquí hay un ejemplo que limpia el databasechangeloglock tabla en cada base de datos que la tenga:

CREATE EXTENSION IF NOT EXISTS dblink;

DO 
$$
DECLARE database_name TEXT;
DECLARE conn_template TEXT;
DECLARE conn_string TEXT;
DECLARE table_exists Boolean;
BEGIN
    conn_template = 'user=myuser password=mypass dbname=';

    FOR database_name IN
        SELECT datname FROM pg_database
        WHERE datistemplate = false
    LOOP
        conn_string = conn_template || database_name;

        table_exists = (select table_exists_ from dblink(conn_string, '(select Count(*) > 0 from information_schema.tables where table_name = ''databasechangeloglock'')') as (table_exists_ Boolean));
        IF table_exists THEN
            perform dblink_exec(conn_string, 'delete from databasechangeloglock');
        END IF;     
    END LOOP;

END
$$
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top