Gerd: Bitte ein Bit! ;-)

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

  1. 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

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. 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.

      Alles korrekt.
      Also ganz einfach ausgedrückt:

      • Wenn der User das 1er Bit hat, darf er alle Daten sehen, die das 1er-Bit auch haben.
      • Wenn der User das 2er Bit hat, darf er alle Daten sehen, die das 2er-Bit auch haben.
        ...

      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

      1. 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

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. 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

      2. 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

        1. 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).

    2. Moin!

      datensatz1     1
      1 AND 3 = 3

      1 AND 3 = 1

      - Sven Rautenberg

      --
      My sssignature, my preciousssss!
      1. hi,

        1 AND 3 = 3

        1 AND 3 = 1

        Klugsch^W... hast ja recht :-)

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }