Você Pode Realizar Consultas Entre Bancos de Dados com PostgreSQL? Veja Como!

Se você está trabalhando com PostgreSQL, pode se perguntar se é possível realizar consultas entre bancos de dados. Isso geralmente surge quando você precisa acessar ou manipular dados que estão divididos entre diferentes bancos de dados. Uma situação comum é quando dois bancos de dados compartilham dados, mas estão configurados separadamente — levando à pergunta: Você pode consultar um banco de dados a partir de outro no PostgreSQL?

O Desafio das Consultas Entre Bancos de Dados

Você pode encontrar uma mensagem de erro semelhante a esta ao tentar executar uma consulta entre bancos de dados:

databaseA=# select * from databaseB.public.someTableName;
ERROR:  referências entre bancos de dados não estão implementadas: "databaseB.public.someTableName"

Este erro indica que o PostgreSQL não suporta nativamente referências diretas entre bancos de dados. Portanto, se seus dados estão armazenados em bancos de dados separados e você precisa realizar consultas entre eles, precisará de uma solução alternativa.

A Solução: Usando Wrappers de Dados Externos

Para realizar consultas entre bancos de dados no PostgreSQL, você pode utilizar o recurso de wrapper de dados externo, especificamente postgres_fdw. Isso permite que você se conecte facilmente a tabelas em qualquer banco de dados PostgreSQL, seja local ou remoto.

Configurando postgres_fdw

  1. Instale a Extensão: Certifique-se de que a extensão postgres_fdw está habilitada na sua instalação do PostgreSQL. Você pode criar a extensão com o seguinte comando:

    CREATE EXTENSION postgres_fdw;
    
  2. Defina um Servidor Externo: Crie um servidor externo que se conecte ao banco de dados alvo:

    CREATE SERVER foreign_server_name
    FOREIGN DATA WRAPPER postgres_fdw
    OPTIONS (host 'host_address', dbname 'databaseB', port '5432');
    
  3. Crie um Mapeamento de Usuário: Você precisará criar um mapeamento para o usuário se conectar ao servidor externo:

    CREATE USER MAPPING FOR local_user
    SERVER foreign_server_name
    OPTIONS (user 'remote_user', password 'remote_password');
    
  4. Importe o Esquema Externo: Você pode importar o esquema externo que contém as tabelas que deseja acessar:

    IMPORT FOREIGN SCHEMA public
    FROM SERVER foreign_server_name
    INTO local_schema;
    
  5. Consulta a Tabela Remota: Agora você pode consultar as tabelas externas como se fossem tabelas locais regulares:

    SELECT * FROM local_schema.some_table_name;
    

Para Versões Antigas do PostgreSQL

Se você está utilizando uma versão do PostgreSQL anterior a 9.3, o recurso de wrapper de dados externo não está disponível. No entanto, você pode utilizar a função dblink, que permite conectar-se a outros bancos de dados PostgreSQL.

  • Usando dblink: Você precisará instalar o pacote postgresql-contrib se ele não fizer parte da sua distribuição. Então, você pode executar uma consulta assim:
    SELECT * FROM dblink('dbname=databaseB user=remote_user password=remote_password',
                        'SELECT * FROM public.some_table_name') AS t(column1 type1, column2 type2, ...);
    

Nota: Sempre considere reestruturar seus bancos de dados, se possível. Usar schemas dentro do mesmo banco de dados, em vez de bancos de dados separados, pode melhorar muito a gestão e o acesso aos dados.

Conclusão

Embora o PostgreSQL não suporte nativamente consultas entre bancos de dados, o uso de wrappers de dados externos como postgres_fdw oferece uma poderosa alternativa. Ao configurar as configurações necessárias, você pode acessar e manipular dados entre diferentes bancos de dados sem dificuldades.

Se você estiver usando uma versão mais antiga, lembre-se de que, embora dblink seja uma opção, atualizar para as versões mais recentes do PostgreSQL pode proporcionar melhor funcionalidade e suporte.

Com as ferramentas e estratégias certas, acessar dados entre bancos de dados é mais fácil do que nunca. Boas consultas!