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 - Instalar uma extensão usando CREATE EXTENSION.
2 - Criar um servidor externo, usando CREATE SERVER, para representar cada banco de dados remoto ao qual deseja se conectar.
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.
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