Hierarchische Rechtestruktur auslesen

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

Anderer Lösungsansatz
Hallo Nochmal.

Ich habe es jetzt anders gemacht, da mit der genannten Struktur nicht das abgebildet werden kann, was ich gerne hätte. Es ist so nur eine lineare „Struktur“ möglich (jedes Recht kann nur ein Kind haben).

Ich habe es umgedreht, die Rechte besitzen nun die Informationen über ihren Vorgänger (parent). Mit einem SQL-Statement kann ich aber auch das nicht aus der Datenbank holen, also habe ich mich dazu entschieden in der Applikation die Rechtestruktur abzubilden. Das mach ich mit einer rekursiven Funktion die einfach mit dem Recht des Benutzers den kompletten Rechtebaum durchgeht und sich die untergeordneten Rechte es Ursprungsrechtes holt. War zwar etwas mehr zu programmieren, aber das Ergebnis stimmt.

Gruß, Bernd