Acesso a dados SQL Server através do PostgreSQL: um guia prático

Acesso a dados SQL Server através do PostgreSQL: um guia prático

Tenho um PostgreSQL e preciso acessar dados que estão no SQL Server! E agora?!

Não! Não precisa entrar em pânico! Existe uma solução para isso.

Digamos que em um determinado ambiente, de uma determinda empresa, surja a necessidade de um banco de dados acessar o conteúdo, ou seja, os dados de outro banco de dados.
E, para piorar, tratam-se de SGBDs (Sistema Gerenciador de Banco de Dados) diferentes!

Por exemplo: Nós podemos ter um SGBD PostgreSQL que necessita acessar dados que estão em um Oracle Database.

E como resolver isso?

Em se tratando do PostgreSQL, existe uma funcionalidade bastante interessante desenvolvida justamente para permitir o acesso a dados de SGBDs externos.
O nome desta funcionalidade é FDW, ou Foreign Data Wrappers.

Essa funcionalidade permite que o PostgreSQL acesse SGBDs como Oracle, MongoDB, SQL Server, entre outros.

E como todos nós somos adeptos de uma boa e velha prática, realizaremos um exemplo super bacana no qual, a partir de um PostgreSQL, acessaremos dados que estão em um SQL Server.

Para isso utilizaremos a FDW tds_fdw desenvovlida por Geoff Montee cujo código fonte encontra-se no GitHub (https://github.com/tds-fdw/tds_fdw). Trata-se de uma FDW cuja função é permitir a conexão do PostgreSQL com os SGBDs SYBASE e SQL Server.

Uma vantagem de produtos de código aberto, como o PostgreSQL, é que você encontra diversas soluções desenvolvidas pela própria comunidade visando resolver necessidades que aparecem no dia a dia, como é o exemplo da extensão tds_fdw

Nosso ambiente é composto por:

  • Uma máquina virtual com o sistema operacional Debian 10 na qual temos instalado o SGBD PostgreSQL 11.17.
  • Uma máquina virtual com o sistema operacional Windows Server 2022 na qual temos instalado o SGBD SQL Server 2019 (Versão 15.0.2000.5)

Existem alguams configurações específicas, em se tratando do SQL Server, que não demonstraremos com imagens, porém, deixaremos aqui o passo a passo para realização das mesmas.

  • Habilitar o TCP/IP e alterar a porta padrão da instância para a porta 15987

1) Menu Iniciar -> SQL Server 2019 Configuration Manager -> SQL Server Network Configuration -> Protocols for SQL2019G1 (Nome da nossa instância no SQL Server)
2) Botão direito em TCP/IP -> Properties
3) Alterar o campo “Enable” para “Yes”
4) Clicar na aba “IP Adresses”
5) Na sessão de IPs na qual aparecer o IP do servidor, limpar o campo “TCP Dynamic Ports” e preencher o campo “TCP Port” com o valor 15987
6) Procurar a sessão “IPALL”, limpar o campo “TCP Dynamic Ports” e preencher o campo “TCP Port” com o valor 15987
7) Ainda no SQL Server 2019 Configuration Manager
8) SQL Server Services
9) Botão direito em “SQL Server (SQL2019G1)” -> Restart

  • Habilitar a porta 15987 no Firewall do Windows Server

1) Menu Iniciar -> Windows Defender Firewall with Advanced Security
2) Inbound Rules
3) New Rule…
4) Criar nova regra permissiva para a porta 15987

A fim de não nos estendermos demais, não demonstraremos o procedimento de instalação do SQL Server propriamente dito

Com relação ao PostgreSQL, realizaremos a instalação da versão 11 na nossa máquina virtual com o sistema operacional Debian 10 e, algums pacotes pertinentes a mesma e, ademais, pacotes necessários a instalação do tds_fdw:


# Atualizacao de repositórios e pacotes 

sudo apt update -y
sudo apt upgrade -y

# Instalacao de pacotes necessarios

sudo apt install ibsybdb5 freetds-dev freetds-common -y
sudo apt install install gnupg gcc make -y
sudo apt install git -y 

# Instalacao do PostgreSQL 11 e pacotes relacionados necessários

sudo apt install install postgresql-11 postgresql-client-11 postgresql-server-dev-11

Agora, de fato, instalaremos o tds_fdw por meio de compilação do código fonte do mesmo.


# Assumir o usuario root com o comando sudo -i

cd /tmp 
git clone https://github.com/tds-fdw/tds_fdw.git
cd tds_fdw
make USE_PGXS=1
make USE_PGXS=1 install

Na etapa acima, nós baixamos o código fonte da FDW tds_fdw e realizamos a instalação da mesma por meio de compilação (Demais, né?!)

Perfeito! Neste ponto já estamos com o PostgreSQL 11, bem como, como a FDW tds_fdw instalada.

O próximo passo é adentrar na instância do PostgreSQL e criar esta extensão dentro do mesmo.

Extensões, no PostgreSQL, são recursos que podem ser adicionados ao banco de dados a fim de que o mesmo resolva questões ou problemas que nativamente não poderiam ser resolvidos


# Assumir o usuario postgres 

sudo su - postgres 

# Adentrar no PostgreSQL 

psql 

# Criar a extensao tds_fdw 

postgres=# CREATE EXTENSION tds_fdw;

Perfeito! Agora precisaremos criar o ambiente que acessaremos no SQL Server.
Para isto, utilizaremos o software Microsoft SQL Server Management Studio 18 (Não entraremos em detalhes quanto a operacionalização do mesmo porém, trata-se da ferramenta gráfica com a qual é realizada a interação com as instâncias SQL Server disponíveis no servidor, de modo que é possível realizar procedimentos por interface [mouse] ou por comandos)

  • Criação do database postgresql_fdw
CREATE DATABASE postgresql_fdw;
  • Criação da tabela pessoa no database postgresql_fdw (Como trata-se de um exemplo, não estamos utilizando as melhores práticas em se tratando da criação de uma tabela).
CREATE TABLE pessoa (
    id int,
    lastname varchar(255),
    firstname varchar(255),
    city varchar(255)
);

  • Aqui estão nossa instância do SQL Server, o database e a tabela que criamos.


  • Inserção de UMA linha na tabela pessoa
INSERT INTO pessoa (id, lastname, firstname, city) 
VALUES ('1' , 'Santos', 'Andre', 'Brasilia'):

Agora, vamos configurar nosso FDW no PostgreSQL.

  • Criação do SERVER que, basicamente, será a conexão com o nosso SQL Server (Percebam que aqui nós precisamos informar o IP do nosso servidor SQL Server, o IP da instância e o nome do database no qual estão os dados que acessaremos)
CREATE SERVER mssql_srv
FOREIGN DATA WRAPPER tds_fdw
OPTIONS (servername '192.168.1.24', port '15987', database 'postgresql_fdw', tds_version '7.1');
  • Listando os nossos foreign servers.

  • Criando o MAPEAMENTO de usuário que efetivamente permitirá que seja realizado o acesso a tabela que desejamos, ou seja, que permitirá que a tabela pessoa do database postgresql_fdw, pertinente ao SQL Server, seja acessado.
CREATE USER MAPPING
FOR postgres
SERVER mssql_srv
OPTIONS (username 'sa', password '+)s#3n__{sr_$%}~>>059ap$$%_@?<M');
  • Por fim, criaremos uma tabela (foreign table) que referenciará a tabela que encontra-se no nosso SQL Server (Válido ressaltar que os campos da foreign table precisam coincidir com os campos da tabela de origem).
CREATE FOREIGN TABLE mssql_postgresql_fdw_pessoa (
id int,
lastname varchar(255),
firstname varchar(255),
city varchar(255))
SERVER mssql_srv
OPTIONS (table_name 'dbo.pessoa', row_estimate_method 'showplan_all');

MARAVILHA! Será que já conseguimos listar, no PostgreSQL, os dados originalmente do SQL Server?!


SIM!!!

Este foi um exemplo bem simples do funcionamento de FDW no PostgreSQL. Existem várias outras possibiliades.

Porém, se não usado com cuidado, esta facilidade poderá se tornar um péssimo gargalo de performance no ambiente!

Anterior Guia prático: Configurando a fila Dead Letter Queue no Logstash
Próxima Gerenciamento eficiente de clusters Kubernetes com a ferramenta K9S

About author

Andre Santos
Andre Santos 2 posts

Analista de banco de dados na 4Linux, apaixonado por games antigos e entusiasta do universo open source

View all posts by this author →

Você pode gostar também

Banco de Dados

Entenda o Snapshot: a ferramenta de backup que não para seu serviço

Atualmente, o termo snapshot tem se popularizado por sua utilidade nas mais variadas Clouds. Este snapshot em questão funciona na sua casa, na sua infraestrutura local e até mesmo na

DevOps

Migrando dados do Moodle de PostgreSQL para Elasticsearch: um guia passo a passo

Recebi a missão de gerar relatórios e estatísticas com os dados do Moodle. Porém, o LMS trabalha somente com bancos de dados relacionais como PostgreSQL e MySQL. O ambiente que

Cloud

Guia completo: Implantação de MongoDB resiliente no Google Kubernetes Engine

Este guia aborda a implantação de um MongoDB resiliente no GKE, incluindo etapas para configurar um StatefulSet, serviço headless e inicializar o conjunto réplica. Aprenda a utilizar recursos do GKE