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!
About author
Você pode gostar também
PGCONF 2022: Maior conferência de PostgreSQL do Brasil retorna presencialmente
De volta ao modelo presencial, a PGCONF acontecerá nos dias 26 e 27 de agosto em São José dos Campos/SP. A 4Linux estará presente como uma das patrocinadoras do evento.
Guia passo a passo para criar um sistema de replicação master/slave em PostgreSQL 9.6
A replicação de dados tem como propósito garantir a alta disponibilidade de dados. Caso o servidor responsável por receber e alterar dados falhe – seja por problemas de hardware, queda
Entenda o Log Binário do MySQL e suas aplicações práticas
O log binário do MySQL é, por vezes, mal compreendido, principalmente por usuários de outros bancos de dados. Nesta postagem pretendo abordar alguns aspectos desse importante mecanismo. Write-ahead logging? Também