ajout des index et transactions

This commit is contained in:
Albert 2025-10-29 10:38:11 +01:00
parent 1649649a0b
commit e0be9f315a

View File

@ -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;`