Vous n'êtes pas identifié(e).
Pages : 1
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
Après quelques recherches, j'imagine que je dois utiliser un cursor avec un fetch...
Hors ligne
Quel est le problème que vous rencontrez exactement ?
Julien.
https://rjuju.github.io/
Hors ligne
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
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.
Julien.
https://rjuju.github.io/
Hors ligne
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
Pages : 1