Wymień uprawnienia do bazy danych za pomocą psql

142

Jestem w trakcie migracji serwera bazy danych i nie mogę zrozumieć (po przejrzeniu i przejrzeniu tutaj), jak mogę wyświetlić listę uprawnień do bazy danych (lub wszystkich uprawnień na serwerze) na PostgreSQL za pomocą psqlnarzędzia wiersza poleceń?

Używam Ubuntu 11.04, a moja wersja PostgreSQL to 8.2.x.

pedrosanta
źródło

Odpowiedzi:

116
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

W Docs naGRANT wyjaśnić, w jaki sposób interpretować wyjście. Aby uzyskać określone uprawnienia w tabeli bieżącej bazy danych, użyj \z myTable.

DrColossos
źródło
5
\z myTablejest idealny dla zapewnienia, że udało Ci przyznany dostęp do kogoś i unikanie patrząc jak idiota kiedy mówisz „dobrze to działa teraz? nie ???
ijoseph
107

może masz na myśli listę użytkowników i ich uprawnienia do bazy danych - nie mogę do końca powiedzieć na podstawie pytania:

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
źródło
Nie, chciałem znaleźć sposób, aby wymienić uprawnienia konkretnej bazy danych, ale już to wymyśliłem. Właściciel bazy danych zawsze ma wszystkie uprawnienia, prawda? Następnie możemy dodać więcej uprawnień do bazy danych innym użytkownikom / grupom. Są one wymienione za pomocą polecenia \ l. Ale i tak bardzo dzięki.
pedrosanta
80

Możesz to zrobić, wykonując następujące czynności:

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

Daje to taki efekt:

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
źródło
10
Witamy na stronie! Jedno małe pytanie: dlaczego wstawiłeś wynik jako zrzut ekranu? Używaj zwykłego tekstu tak często, jak to możliwe.
dezso
1
Czy istnieje sposób, aby zobaczyć pozwolenie na sekwencje? Daje to tylko informacje na temat tabeli
dociekliwe
Pamiętaj, że (przynajmniej w Postgres 9.4) powyższe nie będzie działać w przypadku zmaterializowanych widoków.
SeldomNeedy
@HimanshuChauhan, jeśli dodam nową rolę „nowa_rola” za pomocą roli „czytnik poczty”, to czy informacja_schema.role_table_grants zawiera również nową rolę?
Anand
15

Za pomocą psqlmeta-poleceń:

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

Przejście po stronie za pomocą Ctrl + F daje:

\ddp [ pattern ] Wyświetla domyślne ustawienia uprawnień dostępu.

\dp [ pattern ] Wyświetla tabele, widoki i sekwencje wraz z powiązanymi z nimi uprawnieniami dostępu.

\l[+] [ pattern ] Wyświetl bazy danych na serwerze i pokaż .... uprawnienia dostępu.

Wspomniano także powyżej, ale nie znaleziono ze słowem „uprawnienia” na stronie podręcznika:

\du+dla ról z logowaniem i \dg+dla ról bez - będzie pole, w "Member of"którym znajdziesz role przypisane do ról.

Celowo pomijam tutaj przywileje funkcji i języka, które w psqlpodręczniku są ledwo zmanipulowane (a jeśli skorzystasz z tych przywilejów, nie przyjedziesz tu po poradę). to samo dla typów zdefiniowanych przez użytkownika, domen itd. - użycie „+” po meta-poleceniu pokaże uprawnienia, jeśli dotyczy.


Trochę ekstremalnym sposobem sprawdzenia uprawnień jest upuszczenie użytkownika w transakcji, np .:

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

Gdy lista jest dłuższa niż N (przynajmniej w 9.3), ostrzeżenie z listą uprawnień jest zwinięte, ale nadal możesz znaleźć ją w logach ...

Vao Tsun
źródło
12

Undercovers psql używa poniższego zapytania podczas wydawania \dupolecenia.

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
źródło
czy to standard SQL?
ribamar
`` BŁĄD: kolumna r.rolbypassrls nie istnieje \ n \ nLINE 9:, r.rolbypassrls \ n \ n ^ \ n ",` niestety nie działa
ribamar
10

(Być może oczywistym) dodatkowym krokiem staje się użytkownik postgres, w przeciwnym razie mogą pojawić się błędy związane z nieistniejącymi rolami.

sudo su - postgres
psql -l

lub

psql
postgres=> \l
Adam Shostack
źródło
2
Meta: Dodam to, ponieważ to pytanie jest wysoko oceniane w zapytaniu Google „role postgres list” i spędziłem trochę czasu na wynikach o niższej pozycji, zanim znalazłem to, czego chciałem, więc pamiętam dodatkowe informacje.
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

wynik

usrqtoapp | readme_doc | INSERT
usrqtoapp | readme_doc | SELECT
usrqtoapp | readme_doc | UPDATE
usrqtoapp | readme_doc | DELETE
Yordan Georgiev
źródło