Hallo Experten.
Ich habe mir eine kleine Benutzer/Rollen/Rechte-Struktur in einer Postgres-Datenbank erstellt. Die Rechte sind hierarchisch in der Rechte-Tabelle angelegt in dieser Form:
ID Name Kind
1 superadmin 2
2 admin 3
3 moderator (null)
Das Mapping geht über eine simple Verknüpfungstabelle, also dem User mit der Id 1 ist z.B. das Recht mit der Id 1 zugewiesen, also hat er auch alle darunterliegenden Rechte.
Wie bekomme ich jetzt mit einem SQL-Statement alle seine Rechte auf einmal? Meine Idee war folgende:
SELECT
p1.privilege\_id,
p1.privilege\_name
FROM
privilege p1,
privilege p2,
user\_privilege up
WHERE
up.user\_id = 3 and (
p1.privilege\_id = up.privilege\_id or
p2.privilege\_child = p1.privilege\_id )
Das funktioniert prinzipiell, ich bekomme aber mehr zurück als ich brauche, nämlich das ursprüngliche Recht so oft wie es Rechte gibt. Ich kann das zwar mit einem einfachen DISTINCT erledigen, ist aber unschön und ich glaube wenn die Anzahl der Rechte erheblich steigt wird das auch ein gewisses Performance-Problem.
Hat jemand Ideen oder andere Ansätze wie ich das noch verbessern kann?
Gruß, Bernd