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
|
## 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
|
##### Création index 1
|
||||||
```sql
|
```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);
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
> Voici les resultats avant et après :
|
||||||
Query OK, 0 rows affected (0.265 sec)
|
> Avant : `835 rows in set (0.043 sec)`
|
||||||
Records: 0 Duplicates: 0 Warnings: 0
|
> Après : `835 rows in set (0.004 sec)`
|
||||||
```
|
|
||||||
|
|
||||||
##### Création index 2
|
##### Création index 2
|
||||||
```sql
|
```sql
|
||||||
CREATE INDEX idx_vol_heure_depart ON t_vol(heure_depart);
|
CREATE INDEX idx_vol_heure_depart ON t_vol(heure_depart);
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
> Voici les resultats avant et après :
|
||||||
Query OK, 0 rows affected (0.205 sec)
|
> Avant : `4115 rows in set (0.354 sec)`
|
||||||
Records: 0 Duplicates: 0 Warnings: 0
|
> 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
|
## Utilisateurs et rôles
|
||||||
|
|
||||||
@ -488,8 +491,8 @@ CREATE ROLE 'role_gestionnaire_vols'@'localhost';
|
|||||||
|
|
||||||
##### Assignation des permissions
|
##### Assignation des permissions
|
||||||
```sql
|
```sql
|
||||||
GRANT INSERT, UPDATE ON db_aeroport.t_vol TO 'role_geastionnaire_vols'@'localhost';
|
GRANT SELECT, 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_programme_vol TO 'role_geastionnaire_vols'@'localhost';
|
||||||
GRANT SELECT ON db_aeroport.t_avion TO 'role_gestionnaire_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
|
##### Assignation des permissions
|
||||||
```sql
|
```sql
|
||||||
GRANT INSERT 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 ON db_aeroport.t_reservation 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_passager TO 'role_agent_reservation'@'localhost';
|
|
||||||
GRANT SELECT ON db_aeroport.t_vol 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
|
##### Assignation du rôle à l'utilisateur
|
||||||
```sql
|
```sql
|
||||||
|
GRANT 'role_agent_reservation'@'localhost' TO 'agent_reservation'@'localhost';
|
||||||
```
|
```
|
||||||
|
|
||||||
### Agent de comptoir
|
### Agent de comptoir
|
||||||
@ -574,39 +577,26 @@ CREATE USER 'analyste'@'localhost' IDENTIFIED BY 'analyste';
|
|||||||
GRANT 'role_analyste'@'localhost' TO 'usr_analyste'@'localhost';
|
GRANT 'role_analyste'@'localhost' TO 'usr_analyste'@'localhost';
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Transactions
|
||||||
|
|
||||||
-- 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
|
|
||||||
|
|
||||||
##### Cas 1
|
##### Cas 1
|
||||||
```sql
|
```sql
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
|
|
||||||
-- 1. Supprimer les réservations (table enfant)
|
-- Supprimer le vol
|
||||||
DELETE FROM t_reservation
|
|
||||||
WHERE vol_fk = 25;
|
|
||||||
|
|
||||||
-- 2. Supprimer le vol (table parent)
|
|
||||||
DELETE FROM t_vol
|
DELETE FROM t_vol
|
||||||
WHERE vol_id = 25;
|
WHERE vol_id = 25;
|
||||||
|
|
||||||
|
-- Supprimer les réservations
|
||||||
|
DELETE FROM t_reservation
|
||||||
|
WHERE vol_fk = 25;
|
||||||
|
|
||||||
-- Valider les changements
|
-- Valider les changements
|
||||||
COMMIT;
|
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
|
##### Cas 2
|
||||||
```sql
|
```sql
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
@ -625,19 +615,5 @@ END IF;
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
> `START TRANSACTION;` Démarre un bloc d'opérations
|
> 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;`
|
||||||
|
|
||||||
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.
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user