Conceito básico no Postgres
As funções são objetos globais que podem acessar todos os bancos de dados em um cluster de banco de dados - dados os privilégios necessários.
Um grupo contém muitos bancos de dados , que contém muitos esquemas . Esquemas (mesmo com o mesmo nome) em diferentes bancos de dados não estão relacionados. A concessão de privilégios para um esquema se aplica apenas a esse esquema específico no banco de dados atual (o banco de dados atual no momento da concessão).
Todo banco de dados começa com um esquema
public
por padrão. Isso é uma convenção, e muitas configurações começam com ela. Fora isso, o esquema public
é apenas um esquema como qualquer outro. Vindo do MySQL, você pode querer começar com um único esquema
public
, ignorando efetivamente a camada de esquema completamente. Estou usando dezenas de esquemas por banco de dados regularmente.Os esquemas são um pouco (mas não completamente) como diretórios no sistema de arquivos.
Depois de usar vários esquemas, certifique-se de entender
search_path
contexto:- Como o search_path influencia a resolução do identificador e o "esquema atual"
Privilégios padrão
Por documentação em
GRANT
:
PostgreSQL concede privilégios padrão em alguns tipos de objetos paraPUBLIC
. Nenhum privilégio é concedido aPUBLIC
por padrão em tabelas, colunas, esquemas ou tablespaces. Para outros tipos, os privilégios padrão concedidos aPUBLIC
são os seguintes:CONNECT
eCREATE TEMP TABLE
para bancos de dados;EXECUTE
privilégio para funções; eUSAGE
privilégio para as línguas.
Todos esses padrões podem ser alterados com
ALTER DEFAULT PRIVILEGES
:- Conceder tudo em um esquema específico no banco de dados para uma função de grupo no PostgreSQL
Função do grupo
Como @Craig comentou, é melhor
GRANT
privilégios para uma função de grupo e, em seguida, tornar um usuário específico membro dessa função (GRANT
a função de grupo para a função de usuário). Dessa forma, é mais simples distribuir e revogar pacotes de privilégios necessários para determinadas tarefas. Uma função de grupo é apenas outra função sem login. Adicione um login para transformá-lo em uma função de usuário. Mais:
- Por que o PostgreSQL fundiu usuários e grupos em funções?
Funções predefinidas
Atualização: Postgres 14 ou posterior adiciona as novas funções predefinidas (formalmente "funções padrão")
pg_read_all_data
e pg_write_all_data
para simplificar alguns dos abaixo. Ver:- Conceder acesso a todas as tabelas de um banco de dados
Receita
Digamos, temos um novo banco de dados
mydb
, um grupo mygrp
, e um usuário myusr
... Enquanto estiver conectado ao banco de dados em questão como superusuário (
postgres
por exemplo):REVOKE ALL ON DATABASE mydb FROM public; -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp; -- since we revoked from public
GRANT USAGE ON SCHEMA public TO mygrp;
Para atribuir "a um usuário todos os privilégios a todas as tabelas" como você escreveu (eu posso ser mais restritivo):
GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
Para definir privilégios padrão para objetos futuros, execute para cada função que cria objetos neste esquema:
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;
-- more roles?
Agora, conceda o grupo ao usuário:
GRANT mygrp TO myusr;
Resposta relacionada:
- PostgreSQL - o usuário de banco de dados só deve ter permissão para chamar funções
Configuração alternativa (não padrão)
Vindo do MySQL, e como você deseja manter os privilégios nos bancos de dados separados, você pode gostar desta configuração não padrão
db_user_namespace
. Por documentação:
Este parâmetro habilita nomes de usuário por banco de dados. Ele está desligado por padrão.
Leia o manual com atenção. Eu não uso essa configuração. Não anula o acima.