Перечислите привилегии базы данных, используя psql

144

Я нахожусь в процессе миграции сервера баз данных и не могу понять (после поиска в Google и поиска здесь), как я могу перечислить привилегии базы данных (или все привилегии на сервере) на PostgreSQL с помощью psqlинструмента командной строки?

Я нахожусь на Ubuntu 11.04 и моя версия PostgreSQL - 8.2.x.

pedrosanta
источник

Ответы:

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

В документах поGRANT дать объяснение того , как интерпретировать выходные данные . Для конкретных привилегий в таблице текущей базы данных используйте \z myTable.

DrColossos
источник
5
\z myTableидеально подходит для того, чтобы убедиться, что вы успешно предоставили доступ кому-то, и избегать выглядеть как идиот, когда говорите: «Хорошо, это работает сейчас, это не так? »
ijoseph
109

возможно, вы имеете в виду перечисление пользователей и их привилегий для базы данных - я не могу точно сказать из вопроса:

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) вышеприведенное не будет работать для материализованных представлений.
SeldomNeedy
@HimanshuChauhan, если я добавлю новую роль 'new_role', используя роль 'mailreader', будет ли в information_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 "роли в списке postgres", и я потратил немного времени на результаты с более низким рейтингом, прежде чем нашел то, что хотел, поэтому я запоминаю дополнительную информацию.
Адам Шостак
-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
Йордан Георгиев
источник