segunda-feira, 30 de novembro de 2020

Acessando Tabela Externa dentro do seu Banco de Dados

As vezes precisamos fazer a leitura de dados de um banco que não é o da nossa aplicação, seja um acesso permanente como uma integração ou uma leitura pontual para importação de dados, e é isso que vou mostrar aqui. Esse acesso pode ser feito inclusive para Bancos de Dados diferentes. 

 

Os passos são os seguintes: 

 

  1. 1 - Instalar uma extensão usando CREATE EXTENSION. 

  1. 2 - Criar um servidor externo, usando CREATE SERVER, para representar cada banco de dados remoto ao qual deseja se conectar. 

  1. 3 - Criar um mapeamento de usuário, usando CREATE USER MAPPING, para cada usuário do banco de dados que você deseja permitir o acesso para cada servidor externo. 

  1. 4 - Criar as tabelas externas, usando CREATE FOREIGN TABLE  

 

Para acessar outros bancos dentro do nosso, é preciso de plugins para isso. Os plugins já estão no Postgre e precisam ser “ativados”. Neste exemplo vou mostrar um banco PostgreSQL acessar outro banco PostgreSQL. 

 

Os comandos abaixo exibem os plugins (extensões) disponíveis (o segundo traz um breve comentário sobre o plugin): 

 

SELECT * FROM pg_available_extensions; 

Ou 

SELECT * FROM pg_available_extension_versions 

 

O plugin que vamos usar é o postgres_fdw. Esse comando a seguir vai ativar o plugin e deixá-lo disponível para uso: 

 

CREATE EXTENSION postgres_fdw 

    SCHEMA "public" 

    VERSION "1.0"; 

 

Como essa extensão trata de acesso a um banco de dados, precisamos de um passo a mais que é o de criar o wrapper que vai ficar fazendo a tradução da linguagem de um banco para o outro. 

 

CREATE FOREIGN DATA WRAPPER postgres_fdw 

    HANDLER postgres_fdw_handler 

    VALIDATOR postgres_fdw_validator 

    OPTIONS (); 

 

Caso o wrapper já tenha sido criado, precisamos ver se o handler e o validator foram especificados, caso não, precisamos atualizar. 

 

ALTER FOREIGN DATA WRAPPER postgres_fdw 

    HANDLER public.postgres_fdw_handler 

    VALIDATOR public.postgres_fdw_validator; 

 

Para criar o servidor, vamos precisar do nome do banco, endereço e porta. Para o servidor vamos fazer: 

 

CREATE SERVER nome_servidor 

    FOREIGN DATA WRAPPER postgres_fdw 

  OPTIONS (dbname 'nome_banco', host 'ip_banco', port 'porta'); 

 

Para o(s) usuário(s) 

 

CREATE USER MAPPING 

    FOR postgres 

    SERVER nome_servidor 

    OPTIONS (password 'senha', user 'usuario'); 

 

Agora basta criar as tabelas. Aconselho criar um schema separado para suas tabelas de servidores externos para não misturar com as tabelas internas. Se o usuário tiver permissão de escrita, os comandos de UPDATE, INSERT, e DELETE vão funcionar normalmente. 

 

CREATE FOREIGN TABLE seu_schema.sua_tabela ( 

    id bigserial, 

    nome varchar(70) NOT NULL, 

    dt_nascimento date 

) 

SERVER nome_servidor 

OPTIONS (schema_name 'nome_schema_externo', table_name 'nome_tabela_externa'); 

 

Pode ser necessário dar permissão de acesso no banco externo caso ele esteja restringindo por IP o acesso. Você verá o erro: no pg_hba.conf entry for host "ip_seu_banco", user "usuario_que vc definiu", database "nome_banco_que_quer_acessar". 

 

Pronto, basta usar as tabelas como se estivessem localmente. 

 

Links: 

Nenhum comentário:

Postar um comentário