Bitte ein Bit! ;-)
Gerd
- asp.net
Hallo zusammen,
ich habe ein Bitmuster-Problem.
Folgendes Beispiel:
In meinem Programm gibt es User, die haben jeweils eine bestimmte Leseberechtigung auf die Daten, dargestellt durch ein Bitmuster.
Außerdem habe ich verschiedene Tabellen mit Daten, wo jeweils jeder Datensatz auch einen bestimmten "Projektstatus" hat, ebenfalls als Bitmuster.
z.B.
Tabelle1 projektstatus
---------------------------
datensatz1 1
datensatz2 2
datensatz3 3 (1 or 2)
datensatz4 5 (1 or 4)
datensatz5 7 (1 or 2 or 4)
Ein User mit Berechtigung 2 dürfte von diesen Daten also datensatz 2, 3 und 5 sehen.
Soweit alles klar.
Ich habe aber nun auch User, die mehrere Berechtigungen haben, z.B. (1 or 2).
Die sollen nun alle Daten sehen, die entweder das 1er Bit ODER das 2er Bit haben. Also in diesem Bsp. alle Datensätze.
Versteht ihr, wie's gemeint ist?
Wie geht sowas?
Ich kenne bisher nur die Variante, dass ich nach mehreren Bits suche, dabei aber eine UND-Verknüpfung gemacht wird (also: mein User mit Berechtigung (1 or 2) sieht nur Daten, die auch projektstatus (1 or 2) haben.).
Würde mich über Hilfe freuen!
Gerd
hi,
Ich habe aber nun auch User, die mehrere Berechtigungen haben, z.B. (1 or 2).
Also läuft das auf eine Berechtigungsstufe von binär 11, bzw. dezimal 3 hinaus.
Die sollen nun alle Daten sehen, die entweder das 1er Bit ODER das 2er Bit haben.
Bei einer UND-Verknüpfung der beiden binären Werte soll also das zu prüfende Bit "stehen bleiben", d.h. im Ergebnis noch vorhanden sein.
datensatz1 1
1 AND 3 = 3
datensatz2 2
2 AND 3 = 2
datensatz3 3 (1 or 2)
3 AND 3 = 3
datensatz4 5 (1 or 4)
5 AND 3 = 1
datensatz5 7 (1 or 2 or 4)
7 AND 3 = 3
Für alle diese Beispiele wäre ein User mit Berechtigung 1 oder 2 also berechtigt.
Für einen Berechtigungslevel von 4 wäre er hingegen nicht berechtigt, denn 4 AND 3 = 0.
gruß,
wahsaga
hi,
Ich habe aber nun auch User, die mehrere Berechtigungen haben, z.B. (1 or 2).
Also läuft das auf eine Berechtigungsstufe von binär 11, bzw. dezimal 3 hinaus.
Die sollen nun alle Daten sehen, die entweder das 1er Bit ODER das 2er Bit haben.
Bei einer UND-Verknüpfung der beiden binären Werte soll also das zu prüfende Bit "stehen bleiben", d.h. im Ergebnis noch vorhanden sein.
datensatz1 1
1 AND 3 = 3datensatz2 2
2 AND 3 = 2datensatz3 3 (1 or 2)
3 AND 3 = 3
datensatz4 5 (1 or 4)
5 AND 3 = 1datensatz5 7 (1 or 2 or 4)
7 AND 3 = 3Für alle diese Beispiele wäre ein User mit Berechtigung 1 oder 2 also berechtigt.
Für einen Berechtigungslevel von 4 wäre er hingegen nicht berechtigt, denn 4 AND 3 = 0.
Alles korrekt.
Also ganz einfach ausgedrückt:
Aber wie drück ich das jetzt in der SQL-Query aus?
In der Variable berechtigung steht die Berechtigung des Users (dezimal), also z.B. berechtigung = 3
sql = "select * from tabelle1 where (projektrecht & " &berechtigung& ") = " & [... da weiß ich nicht mehr weiter ...]
LG, Gerd
hi,
Aber wie drück ich das jetzt in der SQL-Query aus?
Das kommt wohl darauf an, welches DBMS du benutzt, und auf welche Weise dessen SQL-Dialekt bitweise logische Operatoren umgesetzt hat.
Ein Blick ins Handbuch sollte weiterhelfen.
gruß,
wahsaga
hi,
Aber wie drück ich das jetzt in der SQL-Query aus?
Das kommt wohl darauf an, welches DBMS du benutzt, und auf welche Weise dessen SQL-Dialekt bitweise logische Operatoren umgesetzt hat.
Ein Blick ins Handbuch sollte weiterhelfen.
Ich arbeite mit MS SQL Server 2000. Aber es hängt ja nicht an der Syntax, ich weiß nicht, was hinter dem Gleich-Zeichen stehen muss ...
sql = "select * from tabelle1 where (projektrecht & " &berechtigung& ") = " & [... da weiß ich nicht mehr weiter ...]
LG
Gerd
gudn tach!
Aber wie drück ich das jetzt in der SQL-Query aus?
In der Variable berechtigung steht die Berechtigung des Users (dezimal), also z.B. berechtigung = 3
sql = "select * from tabelle1 where (projektrecht & " &berechtigung& ") = " & [... da weiß ich nicht mehr weiter ...]
ich vermute mal
sql = "select * from tabelle1 where (projektrecht & " &berechtigung& ") > 0"
denn wenn einer keine berechtigung fuer das projekt hat, werden alle bits auf null gesetzt.
(projektrecht & " &berechtigung& ")>0 ist in etwa
((erstes_bit_von_projektrecht & erstes_bit_von_berechtigung) || ... || (letztes_bit_von_projektrecht & letztes_bit_von_berechtigung))==1,
also wahr, sobald das n-te bit in beiden gleich 1 ist (fuer mind. ein n).
prost
seth
Hey, das muss ich gleich mal ausprobieren.
Hätte nicht gedacht, dass das so einfach ist! ;-)
Super ... meine Rettung!!!
Danke!
Gerd
ich vermute mal
sql = "select * from tabelle1 where (projektrecht & " &berechtigung& ") > 0"denn wenn einer keine berechtigung fuer das projekt hat, werden alle bits auf null gesetzt.
(projektrecht & " &berechtigung& ")>0 ist in etwa
((erstes_bit_von_projektrecht & erstes_bit_von_berechtigung) || ... || (letztes_bit_von_projektrecht & letztes_bit_von_berechtigung))==1,
also wahr, sobald das n-te bit in beiden gleich 1 ist (fuer mind. ein n).
Moin!
datensatz1 1
1 AND 3 = 3
1 AND 3 = 1
- Sven Rautenberg
hi,
1 AND 3 = 3
1 AND 3 = 1
Klugsch^W... hast ja recht :-)
gruß,
wahsaga