Listar os privilégios do banco de dados usando o psql

144

Estou no meio de uma migração de servidor de banco de dados e não consigo entender (depois de pesquisar e pesquisar aqui) como listar os privilégios do banco de dados (ou todos os privilégios no servidor) no PostgreSQL usando a psqlferramenta de linha de comando?

Estou no Ubuntu 11.04 e minha versão do PostgreSQL é 8.2.x.

pedrosanta
fonte

Respostas:

117
postgres=> \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres

Os documentosGRANT dão uma explicação de como interpretar a saída. Para privilégios específicos em uma tabela do banco de dados atual, use \z myTable.

DrColossos
fonte
5
\z myTableé perfeito para garantir que você concedeu com sucesso o acesso a alguém e evitando olhar como um idiota quando você diz "tudo bem ele funciona agora? não ??? "
ijoseph
109

talvez você queira listar usuários e seus privilégios para um banco de dados - não sei exatamente pela pergunta:

postgres=> \du
                             List of roles
    Role name    |  Attributes  |                    Member of
-----------------+--------------+------------------------------------------------
 dba             | Create role  | {util_user,helpdesk_user,helpdesk_admin}
 helpdesk_admin  | Cannot login | {helpdesk_user}
 helpdesk_user   | Cannot login | {helpdesk_reader}
 jack            |              | {helpdesk_admin}
 postgres        | Superuser    | {}
                 : Create role
                 : Create DB
Jack Douglas
fonte
Não, eu queria uma maneira de listar os privilégios de um banco de dados específico, mas eu já descobri. O dono do banco de dados sempre tem todos os privilégios, certo? E depois podemos adicionar mais privilégios no banco de dados a outros usuários / grupos. Aqueles são listados com o comando \ l. Mas muito obrigado mesmo assim.
Pedrosanta
80

Você pode fazer isso seguindo:

SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable'

Isso fornece esse tipo de saída:

mail=# select grantee, privilege_type from information_schema.role_table_grants where table_name='aliases';
   grantee    |  privilege_type
--------------+-----------------
 mailreader   |  INSERT
 mailreader   |  SELECT
 mailreader   |  UPDATE
 mailreader   |  DELETE
 mailreader   |  TRUNCATE
 mailreader   |  REFERENCES
 mailreader   |  TRIGGER
(7 rows)

mail=#
Himanshu Chauhan
fonte
10
Bem vindo ao site! Uma pequena pergunta: por que você inseriu a saída como uma captura de tela? Por favor, use texto normal o mais rápido possível.
Dezso
11
Existe uma maneira de obter permissão para sequências? Isso fornece apenas informações da tabela
inquisitivo
Observe que (pelo menos no Postgres 9.4) o acima não funcionará para visualizações materializadas.
precisa saber é o seguinte
@HimanshuChauhan, se eu adicionar uma nova função 'new_role' usando a função 'mailreader', o information_schema.role_table_grants também listará new_role?
Anand
15

Usando psqlmeta-comandos:

https://www.postgresql.org/docs/current/static/app-psql.html

Passar o mouse sobre a página com Ctrl + F fornece:

\ddp [ pattern ] Lista as configurações de privilégio de acesso padrão.

\dp [ pattern ] Lista tabelas, visualizações e sequências com seus privilégios de acesso associados.

\l[+] [ pattern ] Liste os bancos de dados no servidor e mostre .... privilégios de acesso.

Também mencionado acima, mas não encontrado com a palavra "privilégios" na página de manual:

\du+para funções com login e \dg+para funções sem - terá um arquivo "Member of"onde você encontrará funções concedidas a funções.

Eu pulo deliberadamente os privilégios de função e idioma aqui, encontrados no psqlmanual como pouco manipulados (e se você usar esses privilégios, não virá aqui para um conselho). o mesmo para tipos definidos pelo usuário, domínios e assim por diante - usar "+" após o meta-comando mostrará privilégios, se aplicável.


Uma maneira um pouco extrema de verificar os privilégios é descartar o usuário na transação, por exemplo:

s=# begin; drop user x;
BEGIN
Time: 0.124 ms
ERROR:  role "x" cannot be dropped because some objects depend on it
DETAIL:  privileges for type "SO dT"
privileges for sequence so
privileges for schema bin
privileges for table xx
privileges for table "csTest"
privileges for table tmp_x
privileges for table s1
privileges for table test
Time: 0.211 ms
s=# rollback;
ROLLBACK
Time: 0.150 ms

Quando a lista é maior que N, (pelo menos na 9.3), o aviso com a lista de privilégios é recolhido, mas você ainda pode encontrá-la completa nos logs ...

Vao Tsun
fonte
12

Undercovers psql usa a consulta abaixo quando você emite o \ducomando.

SELECT r.rolname, r.rolsuper, r.rolinherit,
  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,
  r.rolconnlimit, r.rolvaliduntil,
  ARRAY(SELECT b.rolname
        FROM pg_catalog.pg_auth_members m
        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
        WHERE m.member = r.oid) as memberof
, r.rolreplication
, r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;
Dennis
fonte
esse padrão é sql?
Ribamar #
`" ERRO: a coluna r.rolbypassrls não existe \ n \ nLINE 9:, r.rolbypassrls \ n \ n ^ \ n ",` infelizmente, não funciona
ribamar
10

Uma etapa adicional (possivelmente óbvia) é se tornar o usuário do postgres, caso contrário, você poderá obter erros sobre as funções que não existem.

sudo su - postgres
psql -l

ou

psql
postgres=> \l
Adam Shostack
fonte
2
Meta: estou adicionando isso porque esta pergunta é altamente classificada na consulta do Google "papéis da lista do postgres" e passei um pouco de tempo em resultados muito mais baixos antes de encontrar o que queria, então estou comemorando as informações extras.
Adam Shostack
-1
-- file: src/sql/pgsql/list-table-priviledges.sql
-- usage:
-- alias psql="PGPASSWORD=${postgres_db_useradmin_pw:-} psql -v -q -t -X -w -U ${postgres_db_useradmin:-}"
-- psql -d dev_qto < src/sql/pgsql/list-table-priviledges.sql | less
SELECT grantee, table_name , privilege_type
FROM information_schema.role_table_grants
WHERE 1=1
AND grantee = 'usrqtoapp'
AND table_name='readme_doc'
;

-- purpose:
-- list the priveledges per user or for user in a database
-- eof file: src/sql/pgsql/list-table-priviledges.sql

resultado

usrqtoapp | readme_doc | INSERT
usrqtoapp | readme_doc | SELECT
usrqtoapp | readme_doc | UPDATE
usrqtoapp | readme_doc | DELETE
Yordan Georgiev
fonte