2011-01-13 19 views

Respuesta

42

Según http://wiki.postgresql.org/wiki/FAQ

No hay forma de consultar una base de datos distinta de la actual. Debido a que PostgreSQL carga catálogos de sistemas específicos de la base de datos, es incierto cómo una consulta entre bases de datos debería incluso comportarse. contrib/dblink permite consultas entre bases de datos utilizando llamadas a funciones. Del curso , un cliente también puede hacer conexiones simultáneas a diferentes bases de datos y fusionar los resultados en el lado del cliente.

EDITAR: 3 años más tarde (marzo de 2014), esta FAQ se ha revisado y es más útil:

¿Cómo puedo realizar consultas utilizando múltiples bases de datos?

No hay forma de consultar directamente una base de datos que no sea la actual . Debido a que PostgreSQL carga catálogos de sistemas específicos de la base de datos, es incierto cómo se debe comportar incluso una consulta entre bases de datos.

El soporte SQL/MED en PostgreSQL permite crear un "contenedor de datos externo" a , vinculando tablas en una base de datos remota a la base de datos local. La base de datos remota podría ser otra base de datos en la misma instancia de PostgreSQL , o una base de datos a la mitad del mundo, no importa. postgres_fdw está incorporado en PostgreSQL 9.3 e incluye soporte de lectura/escritura ; una versión de solo lectura para 9.2 se puede compilar e instalar como un módulo contrib.

contrib/dblink permite consultas entre bases de datos usando llamadas a funciones y está disponible para versiones de PostgreSQL mucho más antiguas. A diferencia de postgres_fdw , no puede "empujar hacia abajo" las condiciones al servidor remoto, por lo que a menudo terminará obteniendo muchos más datos de los que necesita.

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.

6

No, no puedes. Puede usar dblink para conectarse de una base de datos a otra, pero eso no ayudará si está buscando JOIN.

No puede utilizar diferentes SCHEMA dentro de una única base de datos para almacenar todos sus datos?

+0

No puedo, tenemos algunas bases de datos llenas de datos y nadie quiere cambiar nada:/Si voy a usar este dblink, ¿puedo hacer algo como eso? INSERTAR EN DB1.table SELECT * FROM DB2.table; – sennin

+7

Puede hacer eso si ejecuta la consulta en db1, algo así como 'INSERT INTO db1_table (cols ...) SELECT cols ... FROM dblink (' db2 ',' SELECT cols ... FROM db2_table ') ' – araqnid

+1

He usado esto 'dblink()' para conectar esto, esto me funciona siempre – Manwal

4

Es necesario utilizar dblink ... como araqnid se mencionó anteriormente, algo como esto funciona bien:

seleccione ST.Table_Name, ST.Column_Name, DV.Table_Name, DV.Column_Name, * de information_schema.Columnas ST externa completa dblink ('dbname = otherdatabase', 'seleccionar Table_Name, COLUMN_NAME de INFORMATION_SCHEMA.COLUMNS') DV (texto Table_Name, texto COLUMN_NAME) en ST.Table_Name = DV.Table_name y ST.Column_Name = DV.Column_Name donde ST.Column_Name es nulo o DV.Column_Name es nulo

4

Sí, es posible hacer esto utilizando dblink aunque con consideraciones de rendimiento significativas.

El siguiente ejemplo requerirá que el usuario actual de SQL tenga permisos en ambas bases de datos. Si db2 no se encuentra en el mismo clúster, deberá reemplazar dbname=db2 con la cadena de conexión completa definida en dblink documentation.

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; 

Si table2 es muy grande, podría tener problemas de rendimiento debido a que el sub-consulta cargas de hasta toda la table2 antes de realizar la unión.

2

Tiene la extensión dblink de postgresql.

Reference take from this Article:

extensión dblink de PostgreSQL que se utiliza para conectar una base de datos a otra base de datos.

Instale la extensión DbLink.

CREATE EXTENSION dblink; 

Verificar dblink:

SELECT pg_namespace.nspname, pg_proc.proname 
FROM pg_proc, pg_namespace 
WHERE pg_proc.pronamespace=pg_namespace.oid 
    AND pg_proc.proname LIKE '%dblink%'; 

ya he preparado demostración completa en esto. Visite mi publicación para aprender paso a paso la ejecución de consultas de bases de datos cruzadas en Postgresql.

+0

Buena captura. No todo el mundo sabe que necesita la extensión para estar activo. – Stradas

+0

Gracias Stradas! – Anvesh

10

Olvídate de dblink!

Saluda a Postgres_FDW:

Para preparar para el acceso remoto usando postgres_fdw:

  1. instalar la extensión postgres_fdw usando CREATE EXTENSION.

  2. Cree un objeto de servidor externo, usando CREATE SERVER, para representar cada base de datos remota a la que desea conectarse. Especifique la información de la conexión , excepto el usuario y la contraseña, como opciones del objeto del servidor .

  3. Cree una asignación de usuario, utilizando CREATE USER MAPPING, para cada usuario de la base de datos que desee permitir el acceso a cada servidor extranjero. Especifique el nombre de usuario y contraseña remotos para usar como opciones de usuario y contraseña de la asignación de usuario.

  4. Cree una tabla foránea, utilizando CREATE FOREIGN TABLE o IMPORT FOREIGN SCHEMA, para cada tabla remota a la que desee acceder. Las columnas de la tabla externa deben coincidir con la tabla remota a la que se hace referencia.Sin embargo, puede usar , utilizando nombres de tabla y/o columna diferentes de los de la tabla remota , si especifica los nombres remotos correctos como opciones del objeto de tabla externa .

ahora sólo desea SELECT de una tabla externa para acceder a los datos almacenados en su tabla remota subyacente.

Es realmente útil incluso en datos de gran tamaño.

Cuestiones relacionadas