ajout des index et transactions
This commit is contained in:
parent
1649649a0b
commit
e0be9f315a
78
README.md
78
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;`
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user