Как проверить, есть ли у всех ролей / user / group_role какие привилегии в postgres базе данных? - PullRequest
0 голосов
/ 22 января 2020

У меня есть postgres база данных. Мне нужен список пользователей с привилегиями доступа, которым они назначаются.

Я попытался найти запрос и также обратился к справке по командной строке psql. (\ nu и все), но я не нашел никакой полезной информации.

Кто-нибудь знает об этом, может помочь мне.

Спасибо.

1 Ответ

2 голосов
/ 22 января 2020

Существует несколько базовых c команд, таких как \ du и \ l, которые предоставляют общую информацию.

Для получения подробной информации вы можете использовать следующую функцию.

CREATE OR REPLACE FUNCTION database_privs(text) RETURNS table(username text,dbname name,privileges  text[])
AS
$$
SELECT $1, datname, array(select privs from unnest(ARRAY[
( CASE WHEN has_database_privilege($1,c.oid,'CONNECT') THEN 'CONNECT' ELSE NULL END),
(CASE WHEN has_database_privilege($1,c.oid,'CREATE') THEN 'CREATE' ELSE NULL END),
(CASE WHEN has_database_privilege($1,c.oid,'TEMPORARY') THEN 'TEMPORARY' ELSE NULL END),
(CASE WHEN has_database_privilege($1,c.oid,'TEMP') THEN 'CONNECT' ELSE NULL END)])foo(privs) WHERE privs IS NOT NULL) FROM pg_database c WHERE 
has_database_privilege($1,c.oid,'CONNECT,CREATE,TEMPORARY,TEMP') AND datname not in ('template0');
$$ language sql;

и затем вызвать ту же функцию, указав имя пользователя / роль, которые вы получаете от \ du

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 test      |                                                            | {}
 test2     |                                                            | {}
 test3     |                                                            | {}

postgres=# select * from database_privs('test');
 username |  dbname   |         privileges          
----------+-----------+-----------------------------
 test     | postgres  | {CONNECT,TEMPORARY,CONNECT}
 test     | template1 | {CONNECT}
 test     | test      | {CONNECT,TEMPORARY,CONNECT}
(3 rows)

Раскрытие информации: я работаю на EnterpriseDB (EDB)

...