Integrando MSSQL2000 com POSTGRESQL utilizando FREETDS e o DataWrapper TDS FDW.

No post Acessando MSSQL ODBC….. do PreciseiPostei  precisei acessar um servidor MSSQL2000 utilizando unixODBC e FreeTDS.  Agora temos outra tarefa….

PROBLEMA:

PRECISEI integrar o banco de dados Postgresql com MSSQL2000 SEM utilizar o unixODBC nem a extensão do Postgresql dblink…..

PARA SOLUCIONAR:

Utilizei o Data Wrapper TDS FDW(ao invés do dblink do PostgreSQL) e mantive o  FREETDS acrescentando algumas configurações apenas.

Após estar em produção… POSTEI!!!

Então Vamos lá!

Instalando o FreeTDS

Não vou entrar em detalhes sobre o FreeTDS, pois já abordamos sobre ele  no post Acessando MSSQL ODBC…..,

Aqui iremos abordar apenas as diferenças do FREETDS para essa instalação.

Como mencionado no post  Acessando MSSQL ODBC….. ,o FREETDS possui 3 bibliotecas principais e ,diferentemente, do post anterior(onde utilizamos a biblioteca ODBC), neste vamos utilizar a Biblioteca DB-LIBRARY.

Mãos-a-obra:

a) Baixe o pacote freetds mais atual do repositório oficial(ftp://ftp.freetds.org):

# wget -qO- ftp://ftp.freetds.org/pub/freetds/stable/freetds-1.00.9.tar.gz|tar xvz

b) Entrar no diretório extraído

comando cd

# cd freetds-1.00.9

c) Para compilarmos o pacote, devemos especificar a versão do protocolo TDS a ser utilizado através do argumento “–with-tdsver=numeroversao” (Para informações mais detalhadas sobre versões do TDS, ler o post Acessando MSSQL ODBC…..), Não há necessidade de colocamos como parâmetro do “configure” a biblioteca DB-LIBRARY, ela será compilada por padrão.)

compilar_freetds_tdsfw

#./configure –prefix=/usr –with-tdsver=7.1 

Caso a compilação seja concluída com sucesso, devemos executar:

make_freetds

#make

#make install

Concluindo a instalação, realize o comando:

comando ldconfig

# ldconfig

Assim finalizamos a instalação do freeTDS.


TDS FDW e Data Wrapper

Entendendo um pouco de Foreign DataWrapper e TDS_FDW

O “Foreign Data Wrapper” é responsável por trazer dados de uma fonte de dados remota e (nesse caso) retorna-la para um executor do PostqreSQL. (ref:https://www.postgresql.org/docs/current/static/fdwhandler.html)

Em nossa implementação iremos utilizar um tipo de SQL DataWrapper que é o TDS_FDW.

Será com esse SQL Data Wrapper que iremos nos conectar com SGBDs que usam o protocolo TDS(Tabular Data Stream) e trazer seus dados para o PostgreSQL uma leitura mais detalhada, seu autor “Author: Geoff Montee” descreve a extensão em: https://github.com/tds-fdw/tds_fdw/blob/master/README.md

O TDS-FDW  é um componentes que irá nos auxiliar a manipular o acesso a objetos remotos em base de dados especificas. Existe uma padronização  para manipular esses acessos denominada  Foreign Data Wrapper(FDW);

O FDW utiliza componentes do SQL MED que é um gerenciador de dados externo e é a parte do SQL Padrão que lida com a integração de dados armazenados em base de dados remotas. Existem 2(dois) componentes no SQL/MED o Foreign Table e o Data Link.

Existem diversas implementações de FDW, como pode ser vistas em
ref: https://wiki.postgresql.org/wiki/Foreign_data_wrappers#Foreign_Data_Wrappers

Em nosso cenário serão instaladas e criadas  duas implementações para PostgreSQL do FDW:

  • Extensão tds_fdw

Vou aproveitar uma discussão do link http://comments.gmane.org/gmane.comp.db.postgresql.brasil.devel/3518),e aportuguesar a tradução do TDS_FDW (Postgresql Foreign Data Wrapper)  para Adaptador(conector) de Dados estrangeiros para Postgresql”.

Observação:

Como já dito no post Acessando MSSQL ODBC….., os principais SGBDs  que usam o  protocolo TDS são da Sybase e da Microsoft. (ref:https://github.com/tds-fdw/tds_fdw)

IMPORTANTE

 É estritamente necessário que O TDS_FDW seja utilizado com a versão PostgreSQL 9.2 ou superior. ref:https://github.com/tds-fdw/tds_fdw

É recomendável a utilização do PostgreSQL 9.3 ou superior.

A versão PostgreSQL 9.1 foi lançada com apenas leitura com data wrappers, o suporte de escrita foi adicionado no PostgreSQL 9.3  

        nota traduzida de https://wiki.postgresql.org/wiki/Foreign_data_wrappers

Nesse post foi utilizado a versão PostgreSQL 9.5 que já está instalado!

Depois desse blablablá, muito necessário, vamos trabalhar!

Mãos a obra:

a) Baixar o pacote tds_fdw mais atual do repositório.

download_tds_fw

# wget -qO- https://github.com/GeoffMontee/tds_fdw/archive/v1.0.7.tar.gz|tar xvz

b) Entrar no diretório extraído

cd_tds_fw

# cd tds_fdw-1.0.7

c) Executar o comando make e make install com a instrução PGXS=1 para habilitar a extensão de módulos como o tds_fw.

make_tds_fw

 #make USE_PGXS=1

Se  o resultado do make for algo semelhante a imagem abaixo:

saida_make_tds_fw

Pode seguir executando o  make install também com a instrução PGXS=1 para habilitar a extensão de módulos como o tds_fdw.

make_install_tds_fw

#make USE_PGXS=1 install

Se a saída do ultimo comando se assemelhar com:

saida_make__install_tds_fw

indica que instalação do tds_fdw está finalizada.

VAMOS TESTAR!!!!

a) Crie uma base de dados no postgreSQL para testarmos as tabelas “estrangeiras”

createdb_teste_tdsfw

# createdb -U postgres teste_tdsfdw

b) inclua  no arquivo freetds.conf  as configurações do seu servidor MSSQL2000.Em nosso post, o arquivo encontra-se no diretório /usr/etc/freetds.conf

[MSSQL2000]
host = IP_DO_SERVIDOR_MSSQL2000
port = 1433
tds version = 7.1

Abaixo as especificação dos campos do arquivo freetds.conf

  1. O Nome da Aplicaçao: [NOME]
  2. Endereço do Servidor que está com o MSSQL2000 sendo executado: host
  3. Porta que está respondendo pelo serviço do MSSQL2000: port
  4. Versão do Protocolo TDS a ser utilizado: tds version

c) Para concluir nosso teste do TDS_FDW, podemos utilizar o Administrador e Design gráfico para o postgreSQL “pgAdmin” ou o terminal “psql”  que é um front-end do postgreSQL.

Seguem as duas formas:

 

Usando o pgAdmin 

 

  1. Crie uma conexão com o banco de dados que está rodando o postgreSQL(COM O IP DO SERVIDOR QUE ESTÁ RODANDO O POSTGRESQL).

Em nosso caso o servidor fica em uma maquina também remota. Após a criação conecte-se ao banco remoto.

criar_conexao_postgresql

2- Vá no Item Arquivo(File) do menu principal e logo em seguida clique no submenu Opções(Option).

3- Selecione a opção Display(a esquerda),e marque os seguintes objetos: Foreign Data Wrappers, Foreign Servers e Foreign Tables ( a direita).

display_habilitar_foreign_pgAdmin

Após essa seleção, essas opções ficam visíveis em seu pgAdmin.

4-Crie a extensão do tds_fw utilizando o editor de query do pgAdmin criando uma instrução SQL;

create extension tds_fdw;

create_extension_pgadmin_tds_fw

4-Verifique se a extensão do tds_fw foi adicionada:

verifica_extension_pgadmin_tds_fw1

5- Crie um Servidor Estrangeiro com o nome configurado no freetds.conf(criado no item b, do Vamos Testar!!)

CREATE SERVER fdw_mssql2000
FOREIGN DATA WRAPPER tds_fdw
OPTIONS (servername ‘MSSQL2000’, database ‘teste’);

query_create_server_pgadmin_tds_fdw

Observações importantes:

   -O campo servername conterá o mesmo nome que está entre [ ] “cochetes” configurado no freetds.conf

-O campo database, conterá o banco de dados que queremos acessar no SGBD MSQL2000.

6- Agora devemos criar uma instrução sql para mapeamos o usuário postgres com o usuario do banco MSSQL2000

CREATE USER MAPPING FOR postgres
SERVER fdw_mssql2000
OPTIONS (username ‘sa’, password ‘senha_sa_servidor_mssql2000’);

query_usermap_pgadmin_tds_fdw

7- Por ultimo iremos fazer uma instrução sql para criar a tabela foreign contendo os dados da tabela do banco do MSSQL2000.

CREATE FOREIGN TABLE tabela_teste_fdw(
nome VARCHAR NULL,
idade int NULL,
funfou INT NULL)
SERVER fdw_mssql2000
OPTIONS (query ‘SELECT nome, idade, funfou FROM dbo.tabela_teste’, row_estimate_method ‘showplan_all’);

query_create_tabela_foreign_pgadmin_tds_fdw

Terminada a criação das instruções sql vamos verificar no pgAdmin se tudo foi criado.

verifica_criacao_objetos_fdw

Para confirmar operação, basta clicar com o botão direto em cima da Foreign Tables “tabela_fdw” e em seguida selecionar:

8- “View Data ” em seguida clicar em “View all Rows”

rows_table_fdw

Caso você faça o teste utilizando o pgAdmin e o resultado listou o conteúdo da tabela que se encontra no MSSQL2000,boa noticia!! O TDS-FDW funcionou e trouxe os dados para o PostgreSQL.

logo_preciseipostei

É isso ai , mais uma do Precisei Postei  . Espero ter ajudado!!


Agora vamos fazer usando o terminal “psql”

1- Conectar ao banco utilizando psql

psql_postgres

#psql -U postgres

2-Crie a extensão do tds_fdw criando uma instrução SQL;

create extension tds_fdw

create_extension_tds_fw

3- Crie um Servidor Estrangeiro com o nome configurado no freetds.conf(criado no no item b, do Vamos Testar!!)

CREATE SERVER mssqlteste5
FOREIGN DATA WRAPPER tds_fdw
OPTIONS (servername ‘MSSQL2000’, database ‘teste’);

query_create_server_psql_tds_fdw

4- Para confirmar a criação do Servidor Foreign basta digitar:

\des

verifica_server_foreign_psql

5- Agora devemos criar uma instrução sql para mapeamos o usuário postgres com o usuário do banco MSSQL2000:

CREATE USER MAPPING FOR postgres
SERVER mssqlteste5
OPTIONS (username ‘sa’, password ‘senha_sa_servidor_mssql2000’);

query_usermap_psql_tds_fdw

6- Verificar a criação do usermap:

\deu

verifica_usermap_foreign_psql

6-Por último, iremos fazer uma instrução sql para criar a tabela foreign chamada “tabela_psql_fdw” através de uma consulta aos dados da tabela “dbo.tabela_teste” que encontra-se na base de dados “teste” do MSSQL2000:

CREATE FOREIGN TABLE tabela_psql_fdw(
nome VARCHAR NULL,
idade int NULL,
funfou INT NULL

)
SERVER mssqlteste5
OPTIONS (query ‘SELECT nome, idade, funfou FROM dbo.tabela_teste’, row_estimate_method ‘showplan_all’)

query_create_tabela_foreign_psql_tds_fdw

7- Verificar a criação da Foreign Table:

\det

verifica_table_foreign_psql_fdw

Com as instruções sql concluídas, basta executar uma query na tabela foreign criada e verificar o resultado.

select * from public.tabela_psql_fdw

rows_table_psql_fdw

Se o resultado listou o conteúdo da tabela que se encontra no MSSQL2000, então o TDS-FDW funcionou e trouxe os dados para o PostgreSQL.

É isso ai , mais uma do Prlogo_preciseiposteieciseiPostei  . Espero ter ajudado!!


Configuração do sistema utilizado:

Sistema: Linux

Distribuição: Oracle Linux 6.4

Banco de Dados: Postgresql 9.5

REFERENCIAS:

https://github.com/tds-fdw/tds_fdw

https://github.com/tds-fdw/tds_fdw/blob/master/ForeignTableCreation.md

http://www1.bigsql.org/docs/tds_fdw.jsp

https://www.postgresql.org/docs/9.3/static/sql-createserver.html

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

https://www.mssqltips.com/sqlservertip/3663/sql-server-and-postgresql-foreign-data-wrapper-configuration–part-3/

http://www.freetds.org/

 

Ajude a outros..Compartilhe!!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *