SELECT grantee AS USER, CONCAT(table_schema, '.', TABLE_NAME) AS TABLE, CASE WHEN COUNT(privilege_type) = 7 THEN 'ALL' ELSE ARRAY_TO_STRING(ARRAY_AGG(privilege_type), ', ') END AS grants FROM information_schema.role_table_grants GROUP BY TABLE_NAME, table_schema, grantee;
Un ensemble de fonctions permet de tester ou déterminer si un rôle donné possède certains privilèges sur un objet donné, notamment :
CREATE
, CONNECT
ou TEMPORARY
;SELECT
, INSERT
, UPDATE
, DELETE
, TRUNCATE
, REFERENCES
, TRIGGER
ou MAINTAIN
-- teste si le role yoann peut se connecter à la base postgres SELECT has_database_privilege('yoann', 'postgres', 'CONNECT'); -- Détermine si le role yoann peut mettre à jour la relation pg_user SELECT has_table_privilege('yoann', 'pg_catalog.pg_user', 'INSERT, UPDATE, DELETE');
La liste exhaustive des fonctions disponibles est fournie par la documentation Postgres : https://www.postgresql.org/docs/current/functions-info.html#FUNCTIONS-INFO-ACCESS
Lister les roles affectés à un rôle utilisateur
SELECT roleid, rolname, usename, member FROM pg_auth_members JOIN pg_roles ON pg_roles.oid = pg_auth_members.roleid JOIN pg_user ON pg_user.usesysid = pg_auth_members.member WHERE usename = 'yoann' ;