From e0be9f315a3d8b8ab31b0d116972d75750c7b0c6 Mon Sep 17 00:00:00 2001 From: Albert <87382668+alberrboyyy@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:38:11 +0100 Subject: [PATCH] ajout des index et transactions --- README.md | 78 +++++++++++++++++++------------------------------------ 1 file changed, 27 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index c0f5895..4b79dba 100644 --- a/README.md +++ b/README.md @@ -435,25 +435,28 @@ ORDER BY ## Index +> Comme nous avons vu en classe les index sur les `primary key`, les `foreign key` et les `unique` sont crées automatiquement, nous n'avons donc pas besoin de les créer sur ces types de champ. + ##### Création index 1 ```sql -CREATE INDEX idx_vol_compagnie_heure_depart ON t_vol(compagnie_fk, heure_depart); +CREATE INDEX idx_vol_heure_depart ON t_vol(heure_depart); ``` -``` -Query OK, 0 rows affected (0.265 sec) -Records: 0 Duplicates: 0 Warnings: 0 -``` +> Voici les resultats avant et après : +> Avant : `835 rows in set (0.043 sec)` +> Après : `835 rows in set (0.004 sec)` ##### Création index 2 ```sql CREATE INDEX idx_vol_heure_depart ON t_vol(heure_depart); ``` -``` -Query OK, 0 rows affected (0.205 sec) -Records: 0 Duplicates: 0 Warnings: 0 -``` +> Voici les resultats avant et après : +> Avant : `4115 rows in set (0.354 sec)` +> Après : `4115 rows in set (0.265 sec)` + +> Ici, l'index est le même car dans les deux `WHERE`, `companie_fk` revient une fois et `heure_depart` revient aux deux endroits. Il y a l'index automatique sur `companie_fk`, `heure_depart` est donc la seule colonne a indexer. + ## Utilisateurs et rôles @@ -488,8 +491,8 @@ CREATE ROLE 'role_gestionnaire_vols'@'localhost'; ##### Assignation des permissions ```sql -GRANT INSERT, UPDATE ON db_aeroport.t_vol TO 'role_geastionnaire_vols'@'localhost'; -GRANT INSERT, UPDATE ON db_aeroport.t_programme_vol TO 'role_geastionnaire_vols'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON db_aeroport.t_vol TO 'role_geastionnaire_vols'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON db_aeroport.t_programme_vol TO 'role_geastionnaire_vols'@'localhost'; GRANT SELECT ON db_aeroport.t_avion TO 'role_gestionnaire_vols'@'localhost'; ``` @@ -512,9 +515,8 @@ CREATE ROLE 'role_agent_reservation'@'localhost'; ##### Assignation des permissions ```sql -GRANT INSERT ON db_aeroport.t_passager TO 'role_agent_reservation'@'localhost'; -GRANT INSERT, UPDATE ON db_aeroport.t_reservation TO 'role_agent_reservation'@'localhost'; -GRANT SELECT ON db_aeroport.t_passager TO 'role_agent_reservation'@'localhost'; +GRANT SELECT, UPDATE, INSERT ON db_aeroport.t_passager TO 'role_agent_reservation'@'localhost'; +GRANT INSERT, UPDATE, INSERT ON db_aeroport.t_reservation TO 'role_agent_reservation'@'localhost'; GRANT SELECT ON db_aeroport.t_vol TO 'role_agent_reservation'@'localhost'; ``` @@ -525,6 +527,7 @@ CREATE USER 'agent_reservation'@'localhost' IDENTIFIED BY 'agent_reservation'; ##### Assignation du rôle à l'utilisateur ```sql +GRANT 'role_agent_reservation'@'localhost' TO 'agent_reservation'@'localhost'; ``` ### Agent de comptoir @@ -574,39 +577,26 @@ CREATE USER 'analyste'@'localhost' IDENTIFIED BY 'analyste'; GRANT 'role_analyste'@'localhost' TO 'usr_analyste'@'localhost'; ``` - - --- Activer les rôles par défaut -SET DEFAULT ROLE ALL TO - 'usr_admin'@'localhost', - 'usr_flight_manager'@'localhost', - 'usr_booking_agent'@'localhost', - 'usr_counter_agent'@'localhost', - 'usr_analyst'@'localhost'; - -FLUSH PRIVILEGES; -``` - -## Transaction +## Transactions ##### Cas 1 ```sql START TRANSACTION; --- 1. Supprimer les réservations (table enfant) -DELETE FROM t_reservation -WHERE vol_fk = 25; - --- 2. Supprimer le vol (table parent) +-- Supprimer le vol DELETE FROM t_vol WHERE vol_id = 25; +-- Supprimer les réservations +DELETE FROM t_reservation +WHERE vol_fk = 25; + -- Valider les changements COMMIT; --- En cas d'erreur (gérée par un bloc TRY...CATCH en SQL procédural), --- on utiliserait ROLLBACK; ``` +> On commance par supprimer le vol, puis la reservation et on `COMMIT;` les changements; + ##### Cas 2 ```sql START TRANSACTION; @@ -625,19 +615,5 @@ END IF; ``` -> `START TRANSACTION;` Démarre un bloc d'opérations -> `` - -START TRANSACTION; : Démarre un bloc d'opérations atomiques. - -SELECT COUNT(*)... : Elle vérifie d'abord si le siège '12A' est déjà pris (COUNT(*) > 0) sur le vol '10'. Le résultat (0 ou 1, ou plus) est stocké dans la variable @seat_taken. - -IF @seat_taken = 0 THEN : Si la variable est à 0 (le siège est libre) : - - INSERT INTO... : Elle insère la nouvelle réservation pour le passager 5 sur ce vol 10 à ce siège '12A'. - - COMMIT; : La réservation est confirmée et la transaction se termine avec succès. - -ELSE : Si @seat_taken n'est pas 0 (le siège est déjà occupé) : - - ROLLBACK; : La transaction est annulée. L'INSERT n'a jamais lieu, et la base de données revient à son état initial, empêchant ainsi une double réservation. +> On lance une transaction pour controller si le siège 12A pour le vol 10 est déjà prit, si il n'est pas prit on met 0 dans la variable `@seat_taken` sinon on met 1. +> Si le siège est vide (@seat_taken = 0) alors on y ajoute un passager et on `COMMIT;`, sinon on `ROLLBACK;`