Ich habe einen Datenbankserver, der recht viele User/Rollen (ca. 800) hat. Da hat sich über die Jahre einiges angesammelt. Diese haben sich leider über die Jahre angesammelt. Nun würde ich gern eine Bereinigung vornehmen. Gibt es eine Möglichkeit User/Rollen zu löschen, die nicht mehr in den Datenbanken verwendet werden? Am Besten wäre es, wenn diese seit 10 Jahren nicht mehr aktiv sind.
Du kannst mit folgender Abfrage erst mal prüfen, ob die Objekte besitzen:
select rolname, count(pg_class.relowner) from pg_roles left join pg_class on pg_roles.oid=pg_class.relowner group by rolname order by count(pg_class.relowner) asc;
Was Du nicht erkennen kannst: wie lange die nicht aktiv waren.
Ah ok. Dann nützt sie mir leider nichts, da alle Tabellen standardmäßig einem anderen Nutzer gehören.
Ich benötige eine Abfrage, die prüft, ob die Nutzer überhaupt noch in den DBs auf dem Server vorhanden sind, bzw. dort noch verwendet (Stichwort GRANTS) werden.
Du kannst folgende Abfrage verwenden um das etwas kryptische Format von pg_class.relacl in etwas lesbares zu verwandeln.
SELECT c.relname,
c.relowner::regrole as owner,
a.grantor::regrole,
a.grantee::regrole,
array_agg(privilege_type) as granted_privs
FROM pg_class c
cross join aclexplode(c.relacl) AS a
WHERE c.relnamespace = 'public'::regnamespace
GROUP BY c.relname, c.relowner, a.grantor, a.grantee
ORDER BY c.relname, a.grantor