Existem muitas quase duplicatas para esta pergunta e todas que encontrei até agora estavam erradas e/ou incompletas, então sinto que precisamos de uma resposta canônica.
No PostgreSQL, como posso conceder todas as permissões em um banco de dados a um usuário, sem dar a ele permissões de SUPERUSER?
Isso inclui todas as tabelas , sequências , tipos , gatilhos , índices , procedimentos e quaisquer outros objetos que estejam atualmente no banco de dados e quaisquer objetos que sejam criados no banco de dados posteriormente, por este usuário ou outros. Claro, também inclui a capacidade de criar objetos no banco de dados.
O que você pergunta é pouco prático - você normalmente usaria um superusuário para isso. Porque, citando o manual :
E:
Portanto, para que um não superusuário também tenha esses privilégios, ele teria que ser membro (direta ou indiretamente) em todas as funções que têm permissão para criar objetos.
Conceder associação em uma função de superusuário não torna o membro um superusuário.
Mas a função de membro agora pode se
SET ROLE
tornar superusuário . Pode ou não ser o que você quer.Então, como proprietário,
admin_role
pode tambémGRANT
quaisquer privilégios adicionais (que podem ter sido revogados) ele mesmo.Ou você configura um regime que atribui a propriedade de todos os objetos existentes e futuros a uma função e concede associação somente a essa função. A maneira rápida de fazer isso para todos os objetos de determinadas funções é
REASSIGN OWNED
. Relacionado:Mas você gostaria de conceder propriedade a objetos no catálogo do sistema também? Esses são de propriedade do superusuário
postgres
na configuração padrão.Em vez disso, eu usaria um superusuário onde os privilégios "todos" são necessários. E conceda apenas os privilégios necessários (incluindo
CREATEDB
eCREATEROLE
) a uma função de administrador. Uma receita para uma função de administrador poderosa (sem todos os privilégios):