Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Binärt fält med "bitwise or"

Postades av 2005-10-12 09:30:02 - Jenny Månsson, i forum sql-server/msde, Tråden har 11 Kommentarer och lästs av 1149 personer

Jag har ett fält Permission som är binärt.
Där jag har värdena:
1 - Användaren får läsa
2 - Skapa
4 - Modifiera
8 - Radera
Innehåller fältet värdet 15 så har användaren rätt att utföra allt.
Användaren kan vara med i flera usergroups som har olika permissions.
Exempelvis har användaren 6 i en grupp men kanske bara 2 i en annan grupp.

Jag har en select fråga där jag listar användarens alla permissions
på olika områden i programmet ID 1, 2, 3 osv...innebär olika områden.
Problemet är om användaren i exempelvis område 2 har olika permissions i olika
usergroups. Då vill jag ha en enda rad med "bitwise or" med värde 6 och inte två olika där
den ena har 2 och den andra 6. Någon som vet någon bra funktion för
dynamiskt antal rader. Jag gjorde ett litet test på
<code>select checksum_agg(binary_checksum(Permission)) from Permission</code>
men det gav inte det resultat jag ville ha.Någon som har en lösning?

Så här ser min select sats ut nu:
<code>
SELECT PG.PermissionEntity_ID as PermissionEntity_ID, PG.Permission
FROM (PermissionEntity PE LEFT JOIN Permission PG ON PG.PermissionEntity_ID = PE.PermissionEntityID)
JOIN lnkUserUserGroup UUG ON UUG.UserGroup_ID = PG.UserGroup_ID
WHERE PE.permissiontype_id IN (select permissiontypeid from permissiontype where permissionownertype = 2)
AND UUG.[User_ID] = 1 order by PermissionEntity_ID</code>

Resultat:
ID Värde
1 1
2 1
2 15
3 1

Jag skulle vilja ha resultatet:
ID Värde
1 1
2 15
3 1

där jag vill få ut bitwise or (operand = |)
på id = 2
dvs select 1 | 15 = 15
select 2 | 6 = 6
select 1 | 6 = 7
osv


Svara

Sv: Binärt fält med "bitwise or"

Postades av 2005-10-12 16:36:16 - Mikael Sand

Eftersom jag inte vet hur din data ser ut men det resultat du presenterar ger vid handen att du kanske skulle testa med SELECT DISTICT ??

//Mikael Sand


Svara

Sv:Binärt fält med "bitwise or"

Postades av 2005-10-12 17:38:37 - Jenny Månsson

Nej Distinct ger alla unika värden, dvs id 2 ger tillbaka både värde 1 och 15
och det jag vill ha är endast värde 15....


Svara

Sv: Binärt fält med "bitwise or"

Postades av 2005-10-12 17:45:36 - Thomas Vanhaniemi

Kan du inte köra en select max(värde) och gruppera på id?


Svara

Sv:Binärt fält med "bitwise or"

Postades av 2005-10-12 22:47:36 - Per Karlsson

Varför vill du bara ha reda på användarens högsta behörighet per område, och inte behörighetsnivån för varje usergroup? Det känns som en konstig funktion i ett program...


Svara

Sv: Binärt fält med "bitwise or"

Postades av 2005-10-13 07:39:46 - Jenny Månsson

Nej, nej, nej jag förklarade att jag inte vill ha max behörighet! Utan jag vill ha användarens alla behörigheter dvs
<code>select 1 | 6 </code>
ger ett resultat på 7
och är det samma som bitwise or fast jag kan inte använda operatorn | i detta sammanhang eftersom antalet rader per användare är dynamiskt och med min nuvarande sqlfråga får jag två rader istället för 1.

DVS om användaren har värdet 1 i en grupp men värdet 6 i en annan så vill jag ha en enda rad med värdet 7
och inte två stycken rader där den ena är 1 och den andra 6...

Hade jag vetat antal rader etc så hade jag kunnat skriva <code>select fält | fält</code> men eftersom det är dynamiskt antal rader så behöver jag en slags funktion, antingen en egen påhittad eller en befintlig funktion

Så nej max() fungerar inte i detta läget.


Svara

Sv:Binärt fält med "bitwise or"

Postades av 2005-10-13 22:43:29 - Ola Lindfeldt

Jag orkar inte tänka ut en lösning just nu tyvärr :)

Databasen bryter mot 1NF. Gör om, gör rätt.. ;)

http://en.wikipedia.org/wiki/First_normal_form#First_normal_form


Svara

Sv: Binärt fält med "bitwise or"

Postades av 2005-10-14 08:36:09 - Jenny Månsson

Nej db bryter inte mot 1NF...

Jag har
en tabell User
en tabell UserGroup
en länktabell mellan User och Usergroup

möjligtvis att tabellen Permission bryter mot 1NF men den måste se ut så här för att underlätta kopplingen mot olika aktörer både jag och den som har bestämt databasen anser att detta är den smidigaste lösningen istället för 1NF:
en tabell Permission som kan ha en relation till usergroup, eller employee, eller business eller application

Problemet är att en user kan vara medlem i flera usergroups och det är en usergroup som är kopplad till permission.

Vi kan inte ha db på ett annat sätt än det här så därför undrar jag om någon har en lösning. Annars får jag hämta alla rader och manipulera dem i koden istället som en utväg, men det vore snyggast att lösa det i databasen.


Svara

Sv:Binärt fält med "bitwise or"

Postades av 2005-10-14 09:24:40 - Mikael Wedham

Det "går" att lösa i t.ex. en UDF, men frågan är om det är värt det. Som tidigare talare/skrivare: Jag orkar inte lösa det just nu - men det går.
Troligen är det mer tidseffektivt att lösa det i din klient.
Allt är ju till sist en fråga om pengar... Hur mycket tid du måste lägga ner eller hur mycket pengar en konsult vill ha.

Eftersom du skrev att det vore "snyggt" att ha det i databasen, så gissar jag att det inte är prio ett att få till detta :)

/micke


Svara

Sv:Binärt fält med "bitwise or"

Postades av 2005-10-14 10:29:26 - Ola Lindfeldt

Jenny,
Fältet Permission bryter mot 1NF.
1NF säger att attribut skall vara atomära. Ett bytevärde som måste bitmaskas för att få ut olika typer av informationer är inte ett atomärt värde. Man får garanterat problem om man bryter mot 1NF.
Du bör ha flera bit-kolumner för Read, Write, Admin osv.

Men för att hjälpa dig på traven: Googla efter Bitwise OR SQL server. (jag har aldrig sysslat med det av ovan nämnda skäl..)
Du kanske kan göra SUM(bitmaskvärde) GROUP BY UserId.. och sedan göra bitwise OR på det, men jag får huvudvärk bara jag tänker på det... ;)


Svara

Sv: Binärt fält med "bitwise or"

Postades av 2005-10-14 17:16:37 - Per Persson

Förutom den i MySQL inbyggda gruppfunktionen BIT_OR() som gör det du önskar (vilket jag nämnde på PHPportalen), verkar följande fungera i åtminstone MySQL:

SELECT (MAX(Permission & 8) | MAX(Permission & 4) | MAX(Permission & 2) | MAX(Permission & 1)) ...

Om det fungerar i andra databasmotorer vet jag tyvärr inte. Men det är nog värt ett försök.


Svara

Sv:Binärt fält med "bitwise or"

Postades av 2005-10-17 11:50:57 - Jenny Månsson

Perfekt Per! Det fungerade utmärkt!!! Tack så mycket!

<code>SELECT (MAX(Permission & 8) | MAX(Permission & 4) | MAX(Permission & 2) | MAX(Permission & 1)) ...
</code>


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 619
27 953
271 709
473
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies