Databasteknik: Övning 6 - Aktiva databaser
Det här är en övning.
Man behöver inte redovisa något, eller lämna in någon rapport,
men om du har problem eller frågor får du gärna fråga övningsassistenten.
Det finns ett lösningsförslag.
Mål
-
Att prova på att skriva en (någorlunda komplicerad) trigger i en relationsdatabas.
Förberedelser
Läs i boken, och kanske också annat material,
om aktiva database och triggers.
Läs åtminstone detta:
-
Kapitel 16 i kursboken, Aktiva databaser och triggers (kapitel 15 i första upplagan)
Scenario
En databas innehåller bokningar av platserna på ett flygplan:
Varje plats på flygplanet finns med i databasen,
och alla passagerare.
Om planet är fullbokat kan passagerarna skriva upp sig på en väntelista,
med en så kallad väntenotering.
Vi skapar följande tabeller.
Kommandon för att skapa tabellerna och lägga in data finns
här.
Notera att 1:N-sambandet Bokning har implementerats i form av en egen tabell.
Passagerare |
Nummer | Namn | Adress |
1 | Anna | Annagränd 1 |
2 | Bertil | Bertilbo 1 |
3 | Cecilia | C-vägen 1 |
4 | David | Davidstorp |
5 | Erik | Erikshof |
6 | Fia | Fiaorget 2 |
7 | Gun | Gunbohus |
8 | Helge | Helgestig 7 |
9 | Ivar | Ivarvägen 2 |
10 | Jesper | Jesperstorp |
|
|
Plats |
Nummer | Platstyp |
1 | Fönster |
2 | Gång |
3 | Fönster |
4 | Gång |
5 | Fönster |
|
Bokning |
Plats | BokadAv |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 10 |
5 | 10 |
|
Vantelista |
Nummer | Passagerare |
1 | 6 |
2 | 7 |
3 | 8 |
|
|
Som vi ser finns just nu följande bokningar:
- Anna har bokat plats 1.
- Bertil har bokat plats 2.
- Cecilia har bokat plats 3.
- Jesper har bokat både plats 4 och plats 5.
Följande passagerare finns på väntelistan, i den ordningen:
Uppgift
Om någon passagerare avbokar en plats,
så ska den som står först (dvs har lägst nummer)
på väntelistan bokas in på den platsen.
Samtidigt ska den noteringen i väntelistan tas bort.
Skriv en trigger som gör detta.
Tips
-
Triggern ska köras vid borttagning av en bokning,
så en lämplig typ kan vara after delete on Bokning.
-
Mimer klarar inte for each row,
så använd for each statement.
Du kan dock förutsätta att exakt en rad i taget tas bort ur tabellen Bokning.
Thomas Padron-McCarthy
(thomas.padron-mccarthy@oru.se),
22 mars 2021