diff --git a/README.md b/README.md index 6aa3f0b..3eaaa37 100644 --- a/README.md +++ b/README.md @@ -454,3 +454,122 @@ 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 ``` + +## Utilisateurs et rôles + +##### Création des rôles +```sql +CREATE ROLE 'administarteur'; +CREATE ROLE 'gestionnaire_vols'; +CREATE ROLE 'agent_reservation'; +CREATE ROLE 'agent_comptoir'; +CREATE ROLE 'analyste'; +``` + +```sql +-- 1. Administrateur: Contrôle total [cite: 184] +GRANT ALL PRIVILEGES ON db_aeroport.* TO 'administrateur'@'localhost' WITH GRANT OPTION; + +-- 2. Gestionnaire des Vols: Ajout/modif vols et programmes [cite: 192, 195-197] +GRANT INSERT, UPDATE ON db_aeroport.t_vol TO 'role_flight_manager'@'localhost'; +GRANT INSERT, UPDATE ON db_aeroport.t_programme_vol TO 'role_flight_manager'@'localhost'; +GRANT SELECT ON db_aeroport.t_avion TO 'role_flight_manager'@'localhost'; + +-- 3. Agent de Réservation: Gère passagers et réservations [cite: 199-204] +GRANT INSERT ON db_aeroport.t_passager TO 'role_booking_agent'@'localhost'; +GRANT INSERT, UPDATE ON db_aeroport.t_reservation TO 'role_booking_agent'@'localhost'; +-- Droits de lecture nécessaires pour travailler : +GRANT SELECT ON db_aeroport.t_passager TO 'role_booking_agent'@'localhost'; +GRANT SELECT ON db_aeroport.t_vol TO 'role_booking_agent'@'localhost'; + +-- 4. Agent de Comptoir: Vérifie réservations, modifie siège [cite: 206-210] +GRANT SELECT ON db_aeroport.t_reservation TO 'role_counter_agent'@'localhost'; +GRANT SELECT ON db_aeroport.t_passager TO 'role_counter_agent'@'localhost'; +GRANT SELECT ON db_aeroport.t_vol TO 'role_counter_agent'@'localhost'; +GRANT UPDATE (siege) ON db_aeroport.t_reservation TO 'role_counter_agent'@'localhost'; + +-- 5. Analyste: Lecture seule sur tout [cite: 216, 222] +GRANT SELECT ON db_aeroport.* TO 'role_analyst'@'localhost'; +``` + +##### Création des utilisateurs et assignation des rôles +```sql +-- Création des utilisateurs +CREATE USER 'usr_admin'@'localhost' IDENTIFIED BY 'P@sswordAdmin123'; +CREATE USER 'usr_flight_manager'@'localhost' IDENTIFIED BY 'P@sswordFlight123'; +CREATE USER 'usr_booking_agent'@'localhost' IDENTIFIED BY 'P@sswordBooking123'; +CREATE USER 'usr_counter_agent'@'localhost' IDENTIFIED BY 'P@sswordCounter123'; +CREATE USER 'usr_analyst'@'localhost' IDENTIFIED BY 'P@sswordAnalyst123'; + +-- Assignation des rôles +GRANT 'role_admin'@'localhost' TO 'usr_admin'@'localhost'; +GRANT 'role_flight_manager'@'localhost' TO 'usr_flight_manager'@'localhost'; +GRANT 'role_booking_agent'@'localhost' TO 'usr_booking_agent'@'localhost'; +GRANT 'role_counter_agent'@'localhost' TO 'usr_counter_agent'@'localhost'; +GRANT 'role_analyst'@'localhost' TO 'usr_analyst'@'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 + +##### 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) +DELETE FROM t_vol +WHERE vol_id = 25; + +-- Valider les changements +COMMIT; +-- En cas d'erreur (gérée par un bloc TRY...CATCH en SQL procédural), +-- on utiliserait ROLLBACK; +``` + +##### Cas 2 +```sql +START TRANSACTION; + +SELECT COUNT(*) INTO @seat_taken +FROM t_reservation +WHERE vol_fk = 10 AND siege = '12A'; + +IF @seat_taken = 0 THEN + INSERT INTO t_reservation (passager_fk, vol_fk, siege, prix) + VALUES (5, 10, '12A', 250.00); + COMMIT; +ELSE + ROLLBACK; +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.