Translate

Pesquisar este blog

domingo, 17 de agosto de 2014

Conectando o PostgreSQL com outros bancos: FDW

Foreign Data Wrappers implementam a especificação SQL/MED de 2003, para manipulação de dados externos.

Surgiram no PostgreSQL 9.1 ainda como somente-leitura. No PostgreSQL 9.3 essa extensão pode ser leitura e escrita, dependendo da maturidade do plugin utilizado.

https://wiki.postgresql.org/wiki/Foreign_data_wrappers

 Neste exemplo nós vamos utilizar o file_fdw para ler um arquivo CSV, e associá-lo como uma tabela no banco:

#psql -U postgres teste
#create extension file_fdw;
#create server arquivos foreign data wrapper file_fdw;
#create foreign table empregado_csv (
# id integer,
# nome varchar(4000),
# data_contrato varchar(20),
# data_demissao varchar(20)
# ) server arquivos options (format 'csv', filename '/tmp/empregado.csv', delimiter ';', header 'true');

-No exemplo, eu instalei a extensão file_fdw com o comando create extension. É necessário apenas uma vez por banco de dados criado.
-O comando create server cria um servidor. No caso é para ler arquivos CSV,.
-O comando create foreign table cria uma tabela, em que a estrutura deve estar com a do arquivo CSV. No final eu indico o server e as opções de CSV, inclusive o caminho do arquivo. Existem mais opções para o CSV, consulte a documentação do PostgreSQL.


select * from empregado_csv limit 100;
O comando vai abrir o arquivo CSV nas primeiras 100 linhas.



No próximo exemplo, vamos instalar o Oracle Client, o plugin do Oracle e abrir uma tabela de um servidor Oracle no PostgreSQL!!

1-) Instale o Oracle Client, se já não estiver instalado.
2-) Baixe o fonte do oracle_fdw no site https://wiki.postgresql.org/wiki/Foreign_data_wrappers.
3-) Descompacte e make NO_PGXS=1&&make install.

#psql -U postgres teste
#create extension oracle_fdw;

#CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//dbserver.mydomain.com/ORADB');

# GRANT USAGE ON FOREIGN SERVER oradb TO usuariodopg;

# CREATE USER MAPPING FOR usuariodopg SERVER oradb OPTIONS (user 'orauser', password 'orapwd');
#CREATE FOREIGN TABLE oratab ( id integer OPTIONS (key 'true') NOT NULL, 
#text character varying(30), 
#floating double precision NOT NULL 
#) SERVER oradb OPTIONS (schema 'ORAUSER', table 'ORATAB');

-Observe que isso se parece um pouco com o file_fdw, mas deve informar o SID do servidor Oracle no comando create server , e o usuário e senha no comando create user mapping.
-Se você não especificar a chave primária da tabela com OPTIONS (key 'true') não vai poder atualizar registros.


Outra coisa é que é possível copiar uma tabela externa para uma real com o comando create table as:
# create table pgtab as (select * from oratab);