Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Abfrage für Rechtesystem mit Priorität (https://www.delphipraxis.net/99303-sql-abfrage-fuer-rechtesystem-mit-prioritaet.html)

Brainshock 10. Sep 2007 13:51

Datenbank: SQL • Zugriff über: ODBC

SQL Abfrage für Rechtesystem mit Priorität
 
Hallo Gemeinde,

ich schreibe gerade an einem Rechtesystem und hänge momentan bei einer SQL Abfrage.
Der Benutzer meines Programms sucht über eine Datenbanktabelle, soll aber nur Datensätze als Ergebnis zurückbekommen, auf die er das Recht zum Anzeigen (Rightid = 6) hat. Der Tabellenaufbau gestaltet sich so:

Datentabelle (RECHN)

Code:
OBJID | BARCODE | ABSENDER | RECHNR
R-0178 | 00187109 |        1 | 232323   
R-0179 | 00187110 |        3 | 343434
Rechtetabelle (DBACCESS)

Code:
OBJID | RIGHTID | USERID | GROUPID | ACCESS
R-0178 |       6 |    101 |  <NULL> | True
R-0178 |       6 | <NULL> |       2 | False
R-0179 |       6 |    101 |  <NULL> | False
R-0179 |       6 | <NULL> |       2 | True
Die Verbindung zwischen der Datentabelle und der Rechtetabelle erfolgt über die Spalte OBJID.
Mein Benutzer hat die Userid 101 und ist in der Gruppe mit der Groupid 2.

In meinem Beispiel hat der Benutzer auf die ObjId R-0178 das Recht zum Anzeigen und auf die ObjId R-0179 nicht. Die Benutzerrechte haben Priorität, d.h. wird etwas über die Benutzerid verweigert, kann es nicht über eine Gruppe ausgehebelt werden.

Meine momentane, nicht richtig funktionierende, Abfrage sieht wie folgt aus:

SQL-Code:
SELECT DISTINCT RECHN.OBJID, RECHN.BARCODE, RECHN.ABSENDER, RECHN.RECHNR FROM DBACCESS, RECHN WHERE
DBACCESS.OBJID = RECHN.OBJID AND DBACCESS.RIGHTID = 6 AND
(
    (
        DBACCESS.USERID=101 AND DBACCESS.ACCESS = 'True'
    )
    OR
    (
        (
            (
                DBACCESS.GROUPID = 2 AND DBACCESS.ACCESS = 'True'
            )
            AND NOT
            (
                DBACCESS.USERID = 101 AND DBACCESS.ACCESS='False'
            )
        )
    )
)
Vielleicht kann mir einer von euch bei meiner Abfrage behilflich sein kann. Danke.

Gruß

DeddyH 10. Sep 2007 14:36

Re: SQL Abfrage für Rechtesystem mit Priorität
 
Ungetestet (evtl. müssen noch weitere Aliase verwendet werden):
SQL-Code:
SELECT DISTINCT RECHN.OBJID, RECHN.BARCODE, RECHN.ABSENDER, RECHN.RECHNR
FROM RECHN
INNER JOIN DBACCESS ON DBACCESS.OBJID = RECHN.OBJID
WHERE DBACCESS.USERID = 101 AND DBACCESS.ACCESS = 'True'
OR (
    DBACCESS.GROUPID = 2 AND DBACCESS.ACCESS = 'True'
    AND NOT EXISTS(
        SELECT * FROM DBACCESS tmp
        WHERE DBACCESS.OBJID = tmp.OBJID
        AND tmp.USERID = 101
        AND tmp.ACCESS = 'False')
   )

Brainshock 11. Sep 2007 10:12

Re: SQL Abfrage für Rechtesystem mit Priorität
 
Oje, wenn für jede Gruppe in der der Benutzer ist eine extra Select Abfrage rein muss, dann ist das bestimmt aus zeittechnischen Gründen (Abfrage dauert bestimmt zu lange) so nicht umsetzbar.

Ich sehe da momentan nur die Lösung, das Ganze über eine extra Tabelle zu machen, in der dieser Zugriff für den Benutzer schon kombiniert drin steht ( USERID | OBJID | ACCESS ).

Danke.

grenzgaenger 15. Sep 2007 14:59

Re: SQL Abfrage für Rechtesystem mit Priorität
 
beim aufruf der app. läd man einmal die rechte für den user, und speichert diese intern ab. z. b. in 'ner object list.. beim abfragen der rechte, greift man dann auf die interne tabelle zu... das geht dann flott... und du brauchst dich auch nicht dauernt durch den bottleneck zu quälen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz