![]() |
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:
Rechtetabelle (DBACCESS)
OBJID | BARCODE | ABSENDER | RECHNR
R-0178 | 00187109 | 1 | 232323 R-0179 | 00187110 | 3 | 343434
Code:
Die Verbindung zwischen der Datentabelle und der Rechtetabelle erfolgt über die Spalte OBJID.
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 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:
Vielleicht kann mir einer von euch bei meiner Abfrage behilflich sein kann. Danke.
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' ) ) ) ) Gruß |
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') ) |
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. |
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