Bonjour,
J'ai été redirigée sur ce site par un membre d'un Site qui m'a assuré que cette communauté serait plus à même de répondre à mes questions.
Un projet pour un cours de Base de Données me donne du fil à retordre. En effet, nous n'avons vu au cours que les requêtes, et pas du tout la syntaxe des TRIGGER qui sont pourtant bien utiles pour notre projet assez complexe!
Après avoir pioché ici et là des réponses sur l'un ou l'autre tutoriel SQL sur les TRIGGER, les conditions, la gestion des dates,..., voilà le code que j'ai réussi à concocter:
En gros, ça servirait à modifier des statistiques au sein d'autres tables, et d'incrémenter/décrémenter une file d'attente lorsque des visites ont lieu dans un parc d'attraction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 delimiter // CREATE TRIGGER visits_insert_t BEFORE INSERT ON Visits V FOR EACH ROW BEGIN UPDATE Rollercoasters R SET attendance_rate = AVG (visitnbr AS (SELECT COUNT(*) FROM Visits V1, Rollercoasters R1 WHERE V1.id_attraction=R1.id_attraction GROUP BY DAY (V1.Entrance_time) AS visitsday)) WHERE R.id_attraction=NEW.id_attraction; /* A chaque ajout d'une visite, la moyenne journalière des visites est calculée et mise dans la table "Rollercoaster" là où l'ID correspond*/ UPDATE Manege M SET attendance_rate = AVG (visitnbr AS (SELECT COUNT(*) FROM Visits V1, Manege M1 WHERE V1.id_attraction=M1.id_attraction GROUP BY DAY (V1.Entrance_time) AS visitsday)) WHERE M.id_attraction=NEW.id_attraction; /* Idem précédente pour la table "Manège" Note: un même id ne se retrouvera pas dans les 2 tables*/ CASE WHEN(AttractionTime IS NULL) THEN (UPDATE Queue Q1 SET NEW.Occupation = OLD.Occupation+1 WHERE Q1.id_attraction=NEW.id_attraction;/* Ajoute 1 à la file d'attente correspondante lorsque la condition est vérifiée*/ UPDATE Queue Q SET Timeperperson = AVG(SELECT (DATEDIFF (mi,NEW.AttractionTime,NEW.QueueEntranceTime)/Q1.Occupation) FROM Visits V1, Queue Q1 WHERE V1.id_attraction=Q1.id_attraction) WHERE R.id_attraction=NEW.id_attraction; /* Mets à jour le temps d'attente moyen par personne présente dans la file d'attente*/ ) ELSE END; END// CREATE TRIGGER visits_update_t BEFORE UPDATE ON Visits V FOR EACH ROW BEGIN CASE WHEN(OLD.AttractionTime IS NULL AND NEW.AttractionTime IS NOT NULL) THEN (UPDATE Queue Q SET NEW.Occupation = OLD.Occupation-1 WHERE Q.id_attraction=V.id_attraction; /* Retire 1 à la file d'attente correspondante lorsque la condition est vérifiée*/ ) ELSE END; END// delimiter ;
C'est surtout au niveau de la structure conditionnelle que je ne me sens pas à l'aise, le ELSE est-il nécessaire même si aucune action n'est demandé dans un autre cas que celui évoqué (je n'ai pas trouvé de cas similaire dans les tutos consultés)?
D'une manière générale, ai-je utilisé correctement le langage SQL?
Merci d'avance pour les remarques que vous pourrez me faire!![]()
Cecolympe
EDIT: Bon, j'ai déjà trouvé beaucoup d'erreurs par moi-même et grâce à l'aide de la communauté des Zéros, je mettrai mon code pré-corrigé dans un autre post.
Partager