Перерахуйте привілеї бази даних за допомогою psql


142

Я в середині міграції сервера баз даних, і я не можу зрозуміти (після гуглінгу та пошуку тут), як я можу перерахувати привілеї бази даних (або всі привілеї на сервері) на PostgreSQL за psqlдопомогою інструменту командного рядка?

Я перебуваю на Ubuntu 11.04, і моя версія PostgreSQL - 8.2.x.

Відповіді:


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

У документах поGRANT дати пояснення того , як інтерпретувати вихідні дані . Для отримання конкретних привілеїв у таблиці поточної бази даних використовуйте \z myTable.


5
\z myTableідеально підходить для того, щоб ви успішно надали доступ до когось і уникали виглядати як ідіот, коли говорите: «гаразд, це працює зараз? це не так »
ijoseph

107

можливо ви маєте на увазі перерахування користувачів та їх привілеїв для бази даних - я не можу точно сказати з питання:

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

Ні, я хотів спосіб перелічити привілеї певної бази даних, але я вже зрозумів це. Власник бази даних завжди має всі привілеї, правда? А згодом ми можемо додати більше привілеїв до бази даних для інших користувачів / груп. Вони вказані командою \ l. Але дуже дякую все одно.
педросанта

80

Це можна зробити, виконавши:

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

Це дає такий вихід:

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=#

10
Ласкаво просимо на сайт! Одне невелике запитання: чому ви вставили висновок як скріншот? Будь ласка, використовуйте звичайний текст якомога частіше.
дезсо


1
Чи є спосіб я бачити дозвіл на послідовності? Це дає лише табличну інформацію
допитливий

Зауважте, що (як мінімум у Postgres 9.4) вище не працює для матеріалізованих переглядів.
РідкоНеді

@HimanshuChauhan, якщо я додаю нову роль "new_role", використовуючи роль "mailreader", чи буде також перелічена інформація_schema.role_table_grants new_role?
Ананд

15

Використання psqlметакоманд:

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

Перехід на сторінку за допомогою Ctrl + F дає:

\ddp [ pattern ] Указує параметри привілеїв доступу за умовчанням.

\dp [ pattern ] Перелічує таблиці, представлення та послідовності з відповідними правами доступу.

\l[+] [ pattern ] Перерахуйте бази даних на сервері та покажіть .... права доступу.

Також згадано вище, але не знайдено зі словом "привілеї" на сторінці керівництва:

\du+для ролей з логіном та \dg+для ролей без - буде подано файл, "Member of"де ви знайдете ролі, надані ролям.

Я навмисно пропускаю тут функціональні та мовні привілеї, які в psqlпосібнику знаходяться як ледве маніпульовані (і якщо ви користуєтесь цими привілеями, ви не збираєтесь приходити сюди за порадою). те ж саме для визначених користувачем типів, доменів тощо - використання "+" після мета-команди покаже вам привілеї, якщо це можливо.


Трохи екстремальним способом перевірки привілеїв є відмова користувача від трансакції, наприклад:

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

Коли список довший ніж N (принаймні в 9.3), попередження зі списком привілеїв згортається, але ви все одно можете знайти його повним у журналах ...


12

Undercovers psql використовує наступний запит при видачі \duкоманди.

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;

це стандарт sql?
рибамар

`" ПОМИЛКА: стовпець r.rolbypassrls не існує \ n \ nLINE 9:, r.rolbypassrls \ n \ n ^ \ n ",` на жаль, не працює
ribamar

10

(Можливо очевидним) додатковим кроком стає користувач postgres, інакше ви можете отримати помилки щодо ролей, які не існують.

sudo su - postgres
psql -l

або

psql
postgres=> \l

2
Мета: Я додаю це, тому що це питання високо оцінено в запиті google "ролі списку постгресів", і я витратив трохи часу на значно нижчі за рейтингом результати, перш ніж я знайшов те, що хотів, тому запам'ятовую додаткову інформацію.
Адам Шостак

-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

вихід

usrqtoapp | readme_doc | INSERT
usrqtoapp | readme_doc | SELECT
usrqtoapp | readme_doc | UPDATE
usrqtoapp | readme_doc | DELETE
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.