O dblink é um dos mais importantes contribs do PostgreSQL. Consiste em um conjunto de métodos para acesso a outros bancos de dados do PostgreSQL em uma mesma sessão.
Com esta biblioteca é possível fazer consultas, inserções, alteração e exclusão de dados em mais de um banco de dados (PostgreSQL) sem sair da sessão corrente, o que facilita muito a comunicação entre bancos de dados.
Não faz parte do núcleo deste SGBD, mas pode ser instalado sem grandes problemas e é relativamente fácil de se utilizar.
As principais funções do dblink são:
- dblink_connect
- dblink_get_connections
- dblink - para consultas
- dblink_exec - utilizado na inserção, alteração e exclusão de dados
- dblink_disconnect - liberar conexões dblink
Existem alternativas ao uso desta solução para a comunicaçção entre bancos de dados, tais como cargas diárias de bancos de dados, e outros softwares, mas o dblink tem sido bastante empregado na construção da interoperabilidade de bancos de dados do PostgreSQL e se posiciona como boa alternativa.
Ressalvas:
- Este artigo não visa esgotar a sintaxe do dblink e todos os seus comandos. Apenas mostra uma visão geral do seu funcionamento.
Para testar o dblink, crie dois bancos de dados distintos, chamados estoque e vendas, no mesmo servidor ou em máquinas distintas, e insira as seguintes tabelas e dados:
--Banco de Dados VENDA
CREATE TABLE VENDA_ITEM (
cod_venda SERIAL PRIMARY KEY,
cod_prod INTEGER NOT NULL,
quant_vendida INTEGER NOT NULL,
data DATE DEFAULT current_date NOT NULL);
--Banco de Dados ESTOQUE
CREATE DATABASE ESTOQUE;
DROP TABLE ESTOQUE_ITEM;
CREATE TABLE ESTOQUE_ITEM (
cod_prod SERIAL PRIMARY KEY,
desc_prod VARCHAR(50) NOT NULL,
quant_estocada INTEGER NOT NULL CHECK (quant_estocada > 0),
preco NUMERIC(10,2) CHECK (preco > 0));
INSERT INTO ESTOQUE_ITEM VALUES (1, 'Lápis Preto', 10000, 1.50);
INSERT INTO ESTOQUE_ITEM VALUES (2, 'Borracha', 50, 0.90);
INSERT INTO ESTOQUE_ITEM VALUES (3, 'Caderno 200 Folhas', 175, 8.90);
INSERT INTO ESTOQUE_ITEM VALUES (4, 'Agenda do Ano', 40, 12.50);
* dblink_connect
A rotina dblink_connect cria uma conexão na sessão corrente do PostgreSQL para outro banco de dados. Antes de utiliza-la, é necessário configurar o banco de dados para aceitar a conexão, alterando o arquivo pg_hba e as permissões do usuário.
Como parâmetros, devem ser fornecidos o nome da conexão e uma string de parâmetros de conexão para o banco a ser acessado:
--Criação de Conexão com o DBLINK
-- Conecta com o banco de dados estoque
SELECT dblink_connect('myconn', 'hostaddr=10.211.239.55 port=5432 dbname=estoque user=postgres password=post');
-- Cria nova conecxão com o banco de dados estoque, sem interferir na anterior
SELECT dblink_connect('myconn2', 'hostaddr=10.211.239.55 port=5432 dbname=estoque user=postgres password=post');
-- Conecta com o banco de dados vendas
SELECT dblink_connect('myconn3', 'hostaddr=10.211.239.55 port=5432 dbname=vendas user=postgres password=post');
Ressalvas:
- Evite criar muitas conexões pelo dblink. Cada conexão que for criada vai ocupar memória extra e pode impactar no desempenho do seu sistema. A execução dos exemplos anteriores vai criar três conexões ativas na memória.
- Pode haver lentidão de acesso na conexão dblink. Se um dos bancos de dados conectados estiver com problemas de lentidão, a conexão como um todo será lenta.
* dblink_get_connections
Esta função mostra as conexões ativas do dblink. Não mostra as demais conexões ao banco de dados.
Não apresenta parâmetros. Abaixo, a sintaxe:
--Consultando conexões abertas com DBLINK
SELECT dblink_get_connections();
* dblink_disconnect
A rotina dblink_disconnect encerra conexões criadas com o dblink, liberando a memória. Recebe como parâmetro o nome da conexão a ser encerrada. Execute este comando periodicamente para liberar recursos de hardware, evitando manter conexões ociosas.
--Desconexão
SELECT dblink_disconnect('myconn3');
Os próximos posts comentarão as demais funcionalidades do dblink, apresentando exemplos.
Referência:
- Livro PostgreSQL Prático - dblink
3 comentários:
Parabéns pelo psot, me ajudou a resolver alguns problemas com o dblink.
E para que não aja dúvidas para outras pessoas, o nome da conexão criada será usada para o select, inserts e afins com o dblink.
Ex
SELECT towns.*
FROM dblink('myconn','SELECT column1, column1 FROM banco.tabela')
AS towns(column1 integer, column1 integer);
Muito esclarecedor o post
Bom dia. primeiro gostaria de agradecer por compartilhar seu connhecimento. Como sou novo nesse banco de dados gostaria de saber se é possivel passar
um exemplo do select utilizando a base de dados do exemplo?
Bom dia. Material muito bom, para esclarecer quem está começando. Gostaria de aproveitar e, se possível, tirar uma dúvida: tenho 10 tabelas e, destas, apenas uma gera o erro "duplicate connection name", mesmo com a utilização do dblink_disconnect(). Não consegui, até agora, encontrar solução para o erro. Poderia me auxiliar, por gentileza?
Postar um comentário