Rolf b: Rechteverwaltung

Beitrag lesen

Hallo TS,

aus der Hüfte würde ich diesen Schuss (hoffentlich nicht Stuss) abgeben:

SELECT DISTINCT projekt, modul, funktion
FROM rechte
WHERE r.id_user = $user
  OR  r.id_group IN (SELECT id FROM groups g WHERE g.id_user = $user)

Es gibt allerdings DB-Systeme, bei denen eine OR-Bedingung extrem inperformant ist und zu einem Table-Scan führt. Auf unserem IBM Großrechner war OR darum lange verboten. Ob InnoDB in MySQL dazu gehört, weiß ich nicht. Wenn Du nicht viele User hast, ist das wurscht. Wenn Du ein Performance-Problem befürchtest, kannst Du es auch so machen:

SELECT r1.projekt, r1.modul, r1.funktion
FROM rechte r1
WHERE r1.id_user = $user
UNION
SELECT r2.projekt, r2.modul, r2.funktion
FROM rechte r2
WHERE r2.id_group IN (SELECT g.id FROM groups g WHERE g.id_user = $user)

SELECT DISTINCT im ersten Beispiel bzw. der UNION im zweiten Beispiel eliminieren Duplikate, d.h. wenn Du ein Recht auf mehreren Wegen erhältst, bekommst Du trotzdem nur eine Ergebniszeile dafür. Damit diese Vorverdichtung greift, musst Du die selektierten Spalten auf die reinen Rechte begrenzen und die IDs heraushalten. Wenn Du die Duplikate unbedingt haben willst, musst Du den DISTINCT weglassen bzw. dem UNION ein ALL hinzufügen.

Ob Du die Spalten so exakt qualifizieren musst, wie ich das getan habe, weiß ich nicht. Ich habe schon so oft Fehler wegen mehrdeutiger Spaltenangaben bekommen, dass ich lieber zu viel als zu wenig qualifiziere.

Rolf