Figura 22.1. Estrutura lógica hierárquica do PostgreSQL
Um pequeno número de objetos, como nomes de função de banco de dados
(role), banco de dados e espaço de
tabelas, são definidos no nível da instância, e armazenados no
espaço de tabelas pg_global.
Em cada instância existem vários bancos de dados, isolados uns dos
outros, mas que podem acessar objetos no nível de instância.
Em cada banco de dados existem vários esquemas, contendo
objetos como tabelas e funções.
Portanto, a hierarquia completa é: instância, banco de dados,
esquema, tabela (ou algum outro tipo de objeto, como uma função).
Ao se conectar com o servidor de banco de dados, o cliente deve especificar o nome do banco de dados em sua solicitação de conexão. Não é possível acessar mais de um banco de dados por conexão. Entretanto, os clientes podem estabelecer várias conexões com o mesmo banco de dados, ou bancos de dados diferentes. A segurança no nível do banco de dados tem dois componentes: controle de acesso (veja pg_hba.conf), gerenciado no nível de conexão, e controle de autorização (veja Privilégios), gerenciado através do sistema de concessões. Empacotadores de dados externos (veja postgres_fdw) permitem que objetos em um banco de dados atuem como procuradores (proxies) para objetos em outros bancos de dados ou instâncias. O módulo mais antigo dblink fornece um recurso semelhante. Por padrão, todos os usuários podem se conectar a todos os bancos de dados usando todos os métodos de conexão.
Se uma instância do servidor PostgreSQL for planejada para conter projetos ou usuários não relacionados que devem, na maioria das vezes, não se conhecerem, é recomendável colocá-los em bancos de dados separados, e ajustar as autorizações e os controles de acesso de acordo. Se os projetos ou usuários estiverem inter-relacionados e, portanto, puderem usar os recursos uns dos outros, eles devem ser colocados no mesmo banco de dados, mas provavelmente em esquemas separados; esta organização fornece uma estrutura modular com isolamento de espaços de nomes e controle de autorização. Mais informações sobre como gerenciar esquemas são encontradas em Esquemas.
Embora possam ser criados vários bancos de dados em uma única instância, é recomendável considerar cuidadosamente se os benefícios superam os riscos e as limitações. Em particular, o impacto de ter um registro de transações compartilhado (veja Confiabilidade e o Registro de Escrita Antecipada) tem sobre as opções de cópia de segurança e recuperação. Embora os bancos de dados individuais na instância sejam isolados quando considerados da perspectiva do usuário, eles estão ligados intimamente do ponto de vista do administrador do banco de dados.
Os bancos de dados são criados com o comando CREATE DATABASE (veja Criação de banco de dados), e destruído com o comando DROP DATABASE (veja Eliminação de banco de dados). Para determinar o conjunto de bancos de dados existentes, é consultado o catálogo do sistema pg_database. Por exemplo
SELECT datname FROM pg_database;
O meta-comando \l do programa
psql, e a opção de linha de comando
-l, também são úteis para listar os bancos de dados
existentes.
O padrão SQL chama bancos de dados de “catálogos”, mas não existe diferença na prática.