---
title: "Kört fast i databasträsket"
type: "forum-thread"
url: "https://www.webforum.nu/amne/webbutveckling/101199-kört-fast-i-databasträsket"
topic: "Webbutveckling"
topic_url: "https://www.webforum.nu/amne/webbutveckling"
author: "Jesper T"
published: "2004-04-09T21:08:51.000Z"
updated: "2004-04-13T15:44:04.000Z"
replies: 20
views: 568
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/webbutveckling/101199-kört-fast-i-databasträsket"
---

# Kört fast i databasträsket

_Sida 1 av 2._

## #1 — Jesper T, 2004-04-09T21:08Z

Jag kanske har fel databasstruktur men jag tycker att denna känn lite "roddig". Finns kanske ett smartare sätt?!

```
	Set RecSet = Connect.Execute("SELECT ua_add, ua_addurl FROM user_addons WHERE ua_uid="& uid)
	If NOT RecSet.EOF Then
		Do while not RecSet.EOF
			if color="white" then color="gray" else color="white"
		
			Response.write "<tr class="& color &"><td>"& RecSet(0) &"&nbsp:</td><td>"
				Set RecSet2 = Connect.Execute("SELECT ur_"& RecSet(1) &" FROM user_restrictions WHERE ur_id="& id)
				Response.write RecSet2(0)
				Response.write "</td></tr>"& vbCrLf
		
		RecSet.movenext
		loop
	end if
```

Permalänk: https://www.webforum.nu/p/101199

## #2 — LarsG, 2004-04-10T16:55Z

Du har absolut fel datamodell.

Permalänk: https://www.webforum.nu/p/1319138

## #3 — Jesper T, 2004-04-11T19:48Z

Jaha det var det jag tänkte.
Då kanske inlägget kan flyttas till rätt forum.
Min tanke är att olika medlemmar/administratörer i ett community skall kunna administrera olika "avdelningar". Skulle behöva en liten puff i rätt riktning, tips?
Ex

```
[b]tabellen användare[/b]
id | namn |
------------------------
1  | Olle  |
2  | Pelle |
3  | Jöns  |

[b]tabellen rättigheter[/b]
id | avdelning
------------------------
1  | forum
1  | nyhetsbrev
2  | nyheter
3  | medlemmar/rättigheter

(Har man rättigheter att administrera "medlemmar" så skall man även kunna sätta olika rättigheter på andra medlemmar)
```

Permalänk: https://www.webforum.nu/p/1319614

## #4 — Lasp, 2004-04-11T21:04Z

Om du utgår från att en användare har en roll så har han den under en viss tidsrymd och den är då förknippad med olika rättigheter.
Ofta glöms tiden dvs from tom ett visst datum. Tänk så i rioller så ordnar det sig.
Om det är felstavatr så beror det på att Rikard beställde in många öl ikväll.

Permalänk: https://www.webforum.nu/p/1319639

## #5 — Jesper T, 2004-04-11T21:15Z

Que? :q

Permalänk: https://www.webforum.nu/p/1319644

## #6 — cyprys, 2004-04-12T06:41Z

Gör en tredje tabell som kopplar ihop användarna med rättigheterna.

Permalänk: https://www.webforum.nu/p/1319712

## #7 — Jesper T, 2004-04-12T08:25Z

Men det gör jag ju i tabellen rättigheter.
Olle (1) har rätt till att administrera forum och nyhetsbrev.

Permalänk: https://www.webforum.nu/p/1319730

## #8 — cyprys, 2004-04-12T08:38Z

Jag tycker du ska köra på

```
[b]tabellen användare[/b]
id | namn
1  | Olle
2  | Kajsa

[b]tabellen rättigheter[/b]
id | rättighet
1  | forum
2  | användare
3  | nyheter

[b]tabellen användarättigheter[/b]
userID | rättighet
2  | 1
2  | 2
2  | 3
1  | 3
```

I detta fall har Kajsa alla rättigheter medans Olle bara får administrera nyheter.

Permalänk: https://www.webforum.nu/p/1319732

## #9 — Lasp, 2004-04-12T08:45Z

Om man dessutom kompletterar den tredje tabellen med datum intervall från och med till till och med.
Så kan man se när förändringar i rättighetsdelen har förändrats.
Det är viktigt att ta med datum(TS) på transaktionsrättigheter.

Permalänk: https://www.webforum.nu/p/1319735

## #10 — Jesper T, 2004-04-12T08:46Z

Ok, du menar så. Ja det kanske är bra ja.
Men hur skulle man kunna göra en liknande grej som grundinlägget handlade om då?
Alltså, lista alla rättigheter forum, anvädare, nyheter osv
och sedan markera ut vilka rättigheter ex. Olle har?

Permalänk: https://www.webforum.nu/p/1319737

## #11 — cyprys, 2004-04-12T08:53Z

Du hittar f.ö. nog på bättre namn för tabellerna och kolumnerna. ;)

```
' Alla rättigheter Olle har
SELECT t2.rättighet
FROM användarättigheter t1, rättigheter t2
WHERE t2.id = t1.rättighet
AND t1.userID = 1 (userid för Olle)

' Lista alla rättigheter
SELECT rättigheter FROM rättigheter
```

Permalänk: https://www.webforum.nu/p/1319742

## #12 — Jesper T, 2004-04-12T09:09Z

Lasp: Bra aspekt, skall ta med den i beräkningarna.
cyprys: Bra, jag skall labba lite.
Återkommer säkerligen.

Permalänk: https://www.webforum.nu/p/1319760

## #13 — Jesper T, 2004-04-12T09:27Z

> **cyprys skrev:**
>
> Du hittar f.ö. nog på bättre namn för tabellerna och kolumnerna. ;)
>
> ```
> ' Alla rättigheter Olle har
> SELECT t2.rättighet
> FROM användarättigheter t1, rättigheter t2
> WHERE t2.id = t1.rättighet
> AND t1.userID = 1 (userid för Olle)
> 
> ' Lista alla rättigheter
> SELECT rättigheter FROM rättigheter
> ```

Fast tanken var ju att man skulle nästla in det hela så att det blir så här ungefär:

```
[b]Användarrättigheter för Kajsa:[/b]

Forum       |  True
Nyheter     |  False
Nyhetsbrev  |  True
Medlemmar   |  False
Omrästning  |  False
```

Permalänk: https://www.webforum.nu/p/1319779

## #14 — cyprys, 2004-04-12T11:35Z

Men det blir ju så egentligen. Säg att du tar fram alla id för rättigheter som Kajsa har och lägger in dem i t.ex. en array. 
Den array får då värderna {1, 2, 3, 4} t.ex.

Sedan loopar du igenom alla rättigheter som finns. 
För varje loop jämför du om värdet för rättigheten finns i din array. Det är ett enkelt och inte allt för långsamt sätt.

Du skulle även kunna räkna på alla rättigheter och köra en SQL-sats som räknar hur många poster det finns där Kajsa har just den rättigheten. (0 eller 1 alltså)
Den SQL-satsen överlåter jag till LarsG. ;) 
Men den borde inte alls vara så avancerad. LEFT OUTER JOIN mellan rättigheter och användarrättigheter ungefär.

Permalänk: https://www.webforum.nu/p/1319845

## #15 — Jesper T, 2004-04-12T12:19Z

Ja, just ja. 
Man skulle kunna räkna förekomsten av personens id i tabellen "användarättigheter" och köra en if-sats om siffran är högre än 0.
En annan variant är kanske att ta med en case-sats direkt i  sql:en. Men det verkar ju vara hysteriskt svårt att formulera en sådan. Typ: 

```
select id, case when speciellt_id is null then 'False' else 'True' end FROM tbl_rättigheter LEFT JOIN tbl_användarättigheter ON bla. bla. bla.
```

Permalänk: https://www.webforum.nu/p/1319856

## #16 — Jesper T, 2004-04-12T13:22Z

Nix, jag får inte till det.

Permalänk: https://www.webforum.nu/p/1319887

## #17 — LarsG, 2004-04-12T14:36Z

Flyttas från ASP

Permalänk: https://www.webforum.nu/p/1319914

## #18 — Jesper T, 2004-04-12T15:44Z

Usch, svårt som attan.(för den som inte kan) Jag skulle vilja presentera resultatet så här:

```
[b]Användarrättigheter för Kajsa:[/b]

Forum       |  True | 2003-01-01 | 2006-01-10
Nyheter     |  False | 2003-01-01 | 2006-02-11
Nyhetsbrev  |  True | 2003-01-01 | 2006-04-10
Medlemmar   |  False | 2003-01-01 | 2006-06-15
Omrästning  |  False | 2003-01-01 | 2006-02-10
```

 Men nu så listas det på alla andra sätt än detta.
Och sql:en ser ut så här:

```
SELECT ua_add,ual_fromdate,ual_todate, case when ual_umid = "& id &"  then 'checked' end FROM user_addons LEFT JOIN user_accesslevels ON ual_uaid = ua_id AND ua_uid="& uid &" ORDER BY ua_add
```

Permalänk: https://www.webforum.nu/p/1319950

## #19 — Jesper T, 2004-04-13T11:17Z

Tips?

Permalänk: https://www.webforum.nu/p/1320384

## #20 — Pace, 2004-04-13T12:34Z

Jag föreslår denna datamodell i stället (som är väl beprövad & funkis):

En liknande tabell som du har nu, med användare:

```
[b]users[/b]
-----
userid
username
```

Roller (eller "grupp" om man föredrar det uttrycket) som användarna kan tillhöra, exempelvis "admin", "nyhetsskribent" och dylikt:

```
[b]roles[/b]
-----
roleid
roledescription
```

De olika rättigheterna, exempelvis "lägga till nyheter", "ta bort nyheter", "visa nyheter" etc:

```
[b]permissions[/b]
-----------
permissionid
permissiondescription
```

Du behöver också två "jointabeller" där rättigheter/användare/roller paras ihop.

Denna tabell tilldelar användare till ett valfritt antal roller:

```
[b]userroles[/b]
---------
roleid
userid
```

Denna tabell tilldelar rättigheter till rollerna:

```
[b]rolepermissions[/b]
---------------
roleid
permissionid
```

Det är en mycket flexibel design och tillåter att varje användare kan kopplas till en eller flera roller. Varje roll kan ha en eller flera rättigheter. Dessutom kan du lägga till och ta bort rättigheter utan att ändra databasdesignen, vilket är en av de viktigaste egenskaperna. Just nu lägger du bara till en rättighet och tilldelar den till valda roller.

Permalänk: https://www.webforum.nu/p/1320422

---

Tråden på webben: https://www.webforum.nu/amne/webbutveckling/101199-kört-fast-i-databasträsket  
Nästa sida: https://www.webforum.nu/amne/webbutveckling/101199-kört-fast-i-databasträsket/page2.md
