Já vi muitas perguntas sobre alguém tentando conceder uma role_specification a algum other_role , mas recebendo o GRANT
erro
ERROR: must have admin option on role
role_specification
e todas as respostas, de uma forma ou de outra, parecem resumir-se a "Isso está acontecendo porque o WITH ADMIN
não foi usado quando o original foi emitido."GRANT
role
TO
role_specification
...
Então agora eu não posso fazer GRANT
role_specification
TO
other_role
Mas o que me surpreendeu é que não consigo encontrar nada sobre como realmente ver se a opção admin está definida para uma função. Respostas como Liste os privilégios do banco de dados usando o psql revelam privilégios para funções, mas nenhum desses atributos parece corresponder ao arquivo admin option
. A documentação do Postgres também parece muda sobre isso.
Então... onde o Postgres controla isso e como posso consultá-lo?
Com base na resposta de @Erwin Brandstetter, tenho algumas perguntas mais profundas...
- \drg não está disponível para mim. Presumo que esteja em uma versão do Postgres mais recente que 13?
- Isso torna o SQL realmente valioso, mas não tenho certeza de como isso se traduz. Meu resultado é:
SELECT roleid::regrole, member::regrole, grantor::regrole, admin_option
FROM pg_auth_members where roleid::regrole::text like 'content%';;
roleid | member | grantor | admin_option
---------------+---------------+---------------+--------------
content_adm | int_web_admin | content_adm | f
content_rwd | randall | postgres | f
content_rwd | content_adm | postgres | f
Todos os roleid
s têm as admin_option
false em todas as linhas da tabela pg_auth_members (mas um postgres
roleid notavelmente não estava lá). Mesmo assim, content_adm pode conceder content_adm à função int_web_admin, mas não pode conceder content_rwd a ela.
As linhas relevantes do \du
show:
Role name | Attributes | Member of
------------------+----------------+----------------------------------
content_adm | | {content_rwd}
content_rwd | Cannot login | {}
randall | | {content_rwd}
int_web_admin | | {sys_role,content_adm}
(Acredito que a associação content_adm e randall de content_rwd foi configurada pelo DBA anterior)
Portanto, minha segunda pergunta complementar é: Como traduzo o resultado da consulta SQL em informações semelhantes às \drg
?
A opção admin é definida para associação a uma função em outra função (também conhecida como "função de grupo"). Portanto, não é um atributo da função em si.
As informações sobre associações são armazenadas no catálogo do sistema
pg_auth_members
– em uma única instância para todo o cluster de banco de dados.Então, quais funções têm a "opção de administrador" em qual grupo - concedida por quem?
No Postgres 16 , um metacomando correspondente foi adicionado ao psql :
\drg
:Ou
\drgS
para incluir também funções do sistema.Concedi a opção de administrador na função
postgres
deerwin
demonstração. O superusuário “postgres” não possui membros por padrão. Mas se você tornar um membro da função (um movimento extremamente fortalecedor), essa função poderá fazer qualquer coisa depoisSET role postgres
, independentemente da opção do administradorPara obter o mesmo resultado em qualquer versão moderna com SQL simples:
Dei uma olhada na implementação do
\drg
Postgres 16, que é equivalente.