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
# 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.)
#./configure –prefix=/usr –with-tdsver=7.1
Caso a compilação seja concluída com sucesso, devemos executar:
#make
#make install
Concluindo a instalação, realize o comando:
# 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.
# 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_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 USE_PGXS=1
Se o resultado do make for algo semelhante a imagem abaixo:
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 USE_PGXS=1 install
Se a saída do ultimo comando se assemelhar com:
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 -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
- O Nome da Aplicaçao: [NOME]
- Endereço do Servidor que está com o MSSQL2000 sendo executado: host
- Porta que está respondendo pelo serviço do MSSQL2000: port
- 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:
- 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.
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).
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;
4-Verifique se a extensão do tds_fw foi adicionada:
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’);
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’);
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’);
Terminada a criação das instruções sql vamos verificar no pgAdmin se tudo foi criado.
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”
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.
É isso ai , mais uma do Precisei Postei . Espero ter ajudado!!
Agora vamos fazer usando o terminal “psql”
1- Conectar ao banco utilizando psql
#psql -U postgres
2-Crie a extensão do tds_fdw criando uma instrução SQL;
create extension tds_fdw
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’);
4- Para confirmar a criação do Servidor Foreign basta digitar:
\des
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’);
6- Verificar a criação do usermap:
\deu
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’)
7- Verificar a criação da Foreign Table:
\det
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
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 PreciseiPostei . 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/