PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 19/03/2021 11:53:41

Christof25
Membre

Suppression de tous les rôles pour un utilisateur

Bonjour

J'aimerai une requête qui permet de supprimer tous les rôles commençant par TEST qu'un utilisateur peut avoir.

J'ai déjà cela comme requête, si cela peut vous aider :

psql -U $USER-d $BASE-f $UNXEXSQL/deleteRole.sql -v p1=toto

  user   |    role
---------+------------
   toto  | {TESTadmin}
(1 row)

Voici le contenu de la requête.

SELECT COUNT(*) = 1 AS user_exist FROM pg_user WHERE usename = :'p1' \gset

\if :user_exist

\gset
SELECT
      r.rolname as user,
      ARRAY(SELECT b.rolname
        FROM pg_catalog.pg_auth_members m
        LEFT JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
        WHERE m.member = r.oid) as role
FROM pg_catalog.pg_roles r
WHERE  r.rolname = :'p1'
ORDER BY 1;
\else
\echo Warning ! User :p1 not exist on database
\endif

Merci d'avance

Dernière modification par Christof25 (19/03/2021 11:57:52)

Hors ligne

#2 19/03/2021 13:01:16

Christof25
Membre

Re : Suppression de tous les rôles pour un utilisateur

Après quelques recherches, j'imagine que je dois utiliser un cursor avec un fetch...

Hors ligne

#3 19/03/2021 16:01:28

rjuju
Administrateur

Re : Suppression de tous les rôles pour un utilisateur

Quel est le problème que vous rencontrez exactement ?

Hors ligne

#4 19/03/2021 16:10:38

Christof25
Membre

Re : Suppression de tous les rôles pour un utilisateur

Bonjour rjuju
Un problème de connaissance et de pratique ;-)
J'essaie de récupérer la liste des rôles d'un utilisateur  (que j'arrive à faire avec la requête ci-dessus) et de les révoquer un à un à cet utilisateur.
J'essaie de chercher sur google la manière de faire (cursor, loop...) mais pas évident.
voilà voilà

Hors ligne

#5 19/03/2021 16:55:49

rjuju
Administrateur

Re : Suppression de tous les rôles pour un utilisateur

Si je comprends bien il vous suffirait d'exécuter cette requête :

SELECT
    'REVOKE ' || quote_ident(b.rolname) || ' FROM ' || quote_ident(r.rolname)
FROM pg_catalog.pg_roles r
LEFT JOIN pg_catalog.pg_auth_members m ON m.member = r.oid
LEFT JOIN pg_catalog.pg_roles b ON b.oid = m.roleid
WHERE r.rolname = :'p1'
AND b.rolname LIKE 'TEST%' \gexec

Cf https://docs.postgresql.fr/13/app-psql.html pour le fonctionnement de \gexec.

Hors ligne

#6 19/03/2021 18:45:12

Christof25
Membre

Re : Suppression de tous les rôles pour un utilisateur

rjuju a écrit :

Si je comprends bien il vous suffirait d'exécuter cette requête :

SELECT
    'REVOKE ' || quote_ident(b.rolname) || ' FROM ' || quote_ident(r.rolname)
FROM pg_catalog.pg_roles r
LEFT JOIN pg_catalog.pg_auth_members m ON m.member = r.oid
LEFT JOIN pg_catalog.pg_roles b ON b.oid = m.roleid
WHERE r.rolname = :'p1'
AND b.rolname LIKE 'TEST%' \gexec

Cf https://docs.postgresql.fr/13/app-psql.html pour le fonctionnement de \gexec.

Quoi dire de plus? C'est parfait, merci Julien

Bon week-end

Hors ligne

Pied de page des forums