Brunosimioni's Blog

Tecnologia, informação e opinião.

Posts Tagged ‘unixODBC

SQL/MED com odbc_fdw no PostgreSQL 9.1.1

with 2 comments

Pessoal, seguindo o post anterior, continuei minha pesquisa e resolvi postar um outro tutorial estendendo a conexão do PostgreSQL com qualquer banco, através do ODBC.

Para realizar essa ponte é necessária a utilização de um servidor ODBC local, e a extensão odbc_fdw do PostgreSQL, além do driver ODBC do SGBD específico a conexão é desejável.

A idéia geral é que o PostgreSQL converse com um servidor ODBC, que através de drivers, consegue conversar com diversos SGBDs. O mapeamento de tipos e de tabelas é feito diretamente dentro do odbc_fdw no PostgreSQL.

Vamos a receita, iniciando pela configuração do servidor ODBC, e logo após, a configuração do conector SQL/MED:

1. Instale o servidor ODBC no sistema operacional. No meu caso, estou utilizando o linux OpenSuse 11.4, e para realizar o procedimento, instalei o software unixODBC diretamente do YaST.

2. Instale o driver ODBC para o banco destino da conexão. No meu caso, conectei o PostgreSQL em um servidor SQLServer 2005 via FreeTDS (implementação livre do protocolo Tabular Data Stream). Para ganhar tempo e não precisar ficar procurando dependências do FreeTDS para realizar a compilação do zero, instalei um repositório do build service (devel:languages:misc) que já possuia uma compilação para minha distro.

3. Verifique a instalação do driver. No meu caso, a biblioteca responsável pelo driver TDS para o unixODBC estava em /usr/lib64/libtdsodbc.so.0

4. Configure o unixODBC. Através da ferramenta gráfica ODBCConfig é possível instrumentar os arquivos de configuração (tanto de sistema em /etc/unixODBC/{odbc.ini,odbcinst.ini}, quanto de usuário em ~/.odbc.ini) de maneira mais simples. Após a instalação do FreeTDS, já deverá ser possível visualizá-lo na lista de drivers da ferramenta. O próximo passo é configurar uma conexão (DataSource Name – DSN) do ODBC com o banco destino, através do driver instalado.

Visualização dos drivers instalados no unixODBC

CRUD para adição de um DSN

5. Após a finalização do registro do DSN de conexão com seu banco, verifique as configurações nos arquivos referentes. Se você está executando como superusuário, verifique os arquivos de configuração (odbc.ini,odbcinst.ini) em /etc/unixODBC. Caso esteja executando como usuário normal, verifique em ~/.odbc.ini.

6. Faça um teste de conexão do unixODBC através de um utilitário do projeto chamado isql. Este software é um pequeno cliente SQL que permite conectar-se nos bancos suportados pelos drivers registrados (via DSN) no unixODBC. Para o teste, execute:

isql -v <DSN> <UID> <PASSWD>, e brinque com sql. O parâmetro -v indica modo verbose, informando possíveis erros.

.

.

.

Pausa para o café.

.

.

.

Essa primeira parte da receita tratou de efetivar a conexão do unixODBC com o SGBD destino. Uma vez que essa conexão está garantida e estável, podemos seguir em frente, para os passos do odbc_fdw.Assim como anotado no post anterior, é possível realizar a instalação do odbc_fdw via PGNX, ou via Makefile e compilação na unha. Vamos pelo caminho das pedras.

8. Baixe o odbc_fdw através desse link. Descompacte e prepare-se, pois você vai compilar código. Para realizar a compilação é necessário o header do sql.h, que são encontrados no pacote unixODBC-devel. Baixe o pacote através do seu gerenciador de pacotes. Após o download, entre na pasta descompactada do odbc_fdw, execute:

PATH=<CAMINHO DO PG_CONFIG (binários do PGSQL)>:$PATH USE_PGXS=1 make
PATH=<CAMINHO DO PG_CONFIG (binários do PGSQL)>:$PATH USE_PGXS=1 make install

9. Pronto, seu código está compilado e dentro da árvore do PostgreSQL. Registre a extensão instalada através do comando:

psql -c “CREATE EXTENSION odbc_fdw” <BANCO>

Estamos quase lá. A partir de agora, todos os códigos serão executados dentro de uma conexão com algum banco no PostgreSQL (de preferência, o banco que você criou a extensão).

10. Crie um servidor para dados externos utilizando o DSN que você especificou na configuração do driver no unixODBC:

CREATE SERVER odbc_server FOREIGN DATA WRAPPER odbc_fdw OPTIONS (dsn ‘<DSN DO ODBC>’);

Caso você tenha feito merda, remova o servidor através de:

DROP SERVER  odbc_server;

11. Como todo SGBD de respeito exige um usuário e senha, mapeie seu usuário atual do banco PostgreSQL com o usuário do banco destino através de:

CREATE USER MAPPING FOR <PG_USER> SERVER odbc_server OPTIONS (username ‘<REMOTE_USER>’, password ‘s3cr3t’);

Caso você tenha feito merda, remova o mapeamento através de:

DROP USER MAPPING FOR <PG_USER> SERVER odbc_server;

12. Finalmente, mapeie a tabela remota com uma tabela local, através de um FOREIGN TABLE:

CREATE FOREIGN TABLE odbc_table (
db_idfuncionario varchar,
db_re varchar,
db_nome varchar
)
SERVER odbc_server
OPTIONS (
database ‘<REMOTE_DB>’,
schema ‘<REMOTE_SCHEMA>’,
sql_query ‘select idfuncionario, re, nome from funcionarios’,
sql_count ‘select count(*) from funcionarios’,
db_idfuncionario ‘idfuncionario’,
db_re ‘re’,
db_nome ‘nome’
);

Consulte a tabela:

select * from odbc_table limit 10; e seja feliz.

A foreign table permite diversos atributos para mapeamento entre a tabela remota e a local. A tabela completa pode ser encontrada no site do projeto.

Boa sorte!

Written by Bruno Simioni

29 de setembro de 2011 at 1:30 AM