2011-07-16 15 views
5

¿Alguien puede dar un ejemplo (con las diversas declaraciones SQL involucradas) sobre cómo usar contenedores externos de datos en postgresql para habilitar una tabla de una base de datos postgresql A para unirse a una tabla de una base de datos postgresql B?Cómo usar PostgreSQL Foreign Data Wrapper para unir 2 bases de datos postgresql diferentes

No está claro, desde los documentos, hasta qué punto está disponible la funcionalidad FDW en pgsql 9.0 contra 9.1. Los documentos tampoco tienen ejemplos que muestren cómo unirse entre 2 bases de datos postgresql diferentes (con WHERE pushdown de calificador) usando FDW.

http://www.postgresql.org/docs/9.0/static/sql-createforeigndatawrapper.html

http://www.postgresql.org/docs/9.1/static/ddl-foreign-data.html

http://www.depesz.com/index.php/2011/03/14/waiting-for-9-1-foreign-data-wrapper/

Respuesta

6

Usted manipularlo como cualquier mesa. Por Depesz' mensaje:

CREATE FOREIGN TABLE passwd (
    username text, 
    pass text, 
    uid int4, 
    gid int4, 
    gecos text, 
    home text, 
    shell text 
) SERVER file_server 
OPTIONS (format 'text', filename '/etc/passwd', delimiter ':', null ''); 

select * from passwd; 

Los documentos tienen ningún ejemplo de unión de tablas por una buena razón: es llano antiguo SQL ...

La unirse a empujar hacia abajo la actualidad es objeto de una GSOC:

+1

El ejemplo proporcionado es para 'file_server'. ¿Puedes editar el ejemplo para conectarte a un servidor postgresql externo? Gracias. – archmeta

+0

Será el mismo tipo de sintaxis con un servidor diferente. Consulte los documentos correspondientes aquí: http://www.postgresql.org/docs/current/static/sql-createserver.html/'CREATE SERVER miserver FOREIGN DATA WRAPPER OPCIONES pgsql (host 'foo', nombrebd 'foodb', puerto ' 5432 '); ' –

+0

Aparece el error" ERROR: contenedor de datos foráneos "pgsql" no existe "en mi 9.1 - ¿Alguna idea de lo que me falta? Gracias – alfonx

3

La solución más simple que encontré es la extensión dblink. He comprobado en PostgreSQL 9.1:

create extension dblink. 
select * from dblink('port=5452 host=localhost dbname=mydb user=myuser password=xxx', 
        'select id,spaltenname from variablen') as v (a int, b varchar(20)); 

http://www.postgresql.org/docs/9.1/static/dblink.html

Una combinación sencilla sería:

with a as (select * from dblink('port=5452 host=localhost dbname=mydb user=myuser password=xxx', 'select id,spaltenname from variablen') as v (a int, b varchar(20))) 
select a join (select 1)b on (true); 

El ejemplo anterior le permite unirse a una mesa en otro servidor PostgreSQL, pero es solo una copia y luego únete. No hay un "empuje de calificador WHERE automático" como lo llamaste. Se podría, por supuesto, sólo tiene que seleccionar las líneas donde se necesitan en la primera declaración ...

1

Si desea unirse a 2 bases de datos PostgreSQL diferentes recomiendo que uses dblink:

select datos.* 
    FROM dblink('hostaddr=192.168.0.10 port=5432 dbname=my_dbname user=my_user password=my_pass'::text, ' 
       select field_1, field_2 
       from my_table order by field_1 
       ' 
       ::text) 
     datos(field_1, integer, field_2 character varying(10)); 

(he comprobado en PostgreSQL 9.1.3) http://www.postgresql.org/docs/9.2/static/contrib-dblink-function.html

Cuestiones relacionadas