Nutzerbereinigung

Hallo!

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.

Danke für eine Antwort im Voraus.

VG

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.

Danke für die schnelle Antwort. Ich schaue mir die Ergebnisse der Abfrage mal an und melde mich dann nochmal.

Die Abfrage prüft ob noch Rechte der Nutzer/Rolle noch irgendwo in der ausgewählten DB Rechte auf irgendeine Tabelle hat, richtig?

nein, sie prüft nur, ob denen etwas gehört, also ob sie Eigentümer sind.

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.

das kannst Du via pg_class.relacl prüfen.

Ok. Ich werde das mal versuchen. Danke für die Hilfe.

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
1 „Gefällt mir“