Cours P2
Cours P2
COMMIT
▪ Pour enregistrer les modifications
ROLLBACK
• Pour annuler les modifications
▪ Ces commandes ne sont utilisées qu'avec les commandes DML telles que - INSERT, UPDATE et DELETE uniquement.
PARTIE 1
Exemple
START TRANSACTION ;
PARTIE 1
UPDATE compte SET solde = solde – 200 WHERE accountno = ‘ACC1’ ; - - Débiter le compte ACC1
UPDATE compte SET solde = solde + 200 WHERE accountno = ‘ACC2’ ; - - Crediter le compte ACC2
COMMIT ; - - Valider
▪ Les événements MySQL sont des tâches qui CREATE EVENT The_Main_Event
ON SCHEDULE AT TIMESTAMP '2023-01-20 12:00:00'
s'exécutent selon un calendrier spécifié. Par DO DROP TABLE t;
conséquent, les événements MySQL sont
CREATE EVENT test_event_03
parfois appelés événements planifiés.
ON SCHEDULE EVERY 1 MINUTE
▪ MySQL utilise un thread spécial appelé thread STARTS CURRENT_TIMESTAMP
du planificateur d'événements pour exécuter ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
tous les événements planifiés. DO
INSERT INTO messages (message, created_at
▪ On peut afficher l'état du thread du VALUES (‘Test MySQL recurring Event’, NOW());
planificateur d'événements en exécutant la
commande SHOW PROCESSLIST : CREATE EVENT e
ON SCHEDULE EVERY 1 YEAR
PARTIE 1
Introduction
▪ Afin d’éviter qu’un programme ne s’arrête dès la première erreur suite à une instruction SQL, il est indispensable de prévoir
les cas potentiels d’erreurs et d’associer à chacun de ces cas la programmation d’une exception (handler dans le vocabulaire
de MySQL).
▪ Les exceptions peuvent être gérées dans un sous-programme (fonction ou procédure cataloguée) ou un déclencheur.
▪ Une exception MySQL correspond à une condition d’erreur et peut être associée à un identificateur (exception nommée).
▪ Une exception est détectée (aussi dite « levée ») si elle est prévue dans un handler au cours de l’exécution d’un bloc (entre
BEGIN et END ).
PARTIE 1
▪ Une fois levée, elle fait continuer (ou sortir du bloc) le programme après avoir réalisé une ou plusieurs instructions que le
programmeur aura explicitement spécifiées.
▪ Deux mécanismes qui peuvent être mis en œuvre pour gérer une exception en Mysql : CONTINUE et EXIT.
Syntaxe
| condition_name • SQLEXCEPTION : gère toutes les erreurs qui ne sont ni gérées par
| SQLWARNING SQLWARNING ni par NOT FOUND
| NOT FOUND • statement MySQL : une ou plusieurs instructions du langage de MySQL
| SQL EXCEPTION (bloc, appel possibles par CALL d’une fonction ou d’une procédure
} cataloguée).
Copyright - Tout droit réservé - OFPPT 59
01 – Maitriser le langage de programmation
procédurale sous MySQL
Gestion des exceptions
CALL ps_exc_not_found_Exemple1(‘Dalaj’);
▪ Pour intercepter une erreur MySQL et lui attribuer au passage un identificateur, il faut utiliser la clause DECLARE
CONDITION.
▪ Pour la déclaration, on utilise la syntaxe suivante :
DECLARE nomException CONDITION FOR
{SQLSTATE [VALUE] ‘valeur_sqlstate’ | code_erreur_mysql}
PARTIE 1
L’instruction SIGNAL
▪ On utilise l'instruction SIGNAL pour renvoyer une condition
CREATE PROCEDURE ajouter_commande (IN commandeNo,
d'erreur ou d'avertissement à l'appelant à partir d'un sous IN produitCode varchar(45),
programme, par exemple une procédure stockée, une IN qte int,
IN prix double,
fonction stockée, un déclencheur ou un événement. IN ligneNO int )
BEGIN
L'instruction SIGNAL permet de contrôler les informations à DECLARE C INT ;
renvoyer, telles que la valeur et le message SQLSTATE. SELECT COUNT (commandeNumber) INTO C
FROM commandes
▪ Pour l’utilisation de l’instruction, on utilise la syntaxe WHERE commandeNumber = commandeNo;
- - teste si le numéro de la commande existe
suivante : IF (C != 1) THEN
SIGNAL SQLSTATE | nom_exception_nomee; SIGNAL SQLSTATE ‘45000’
SET MESSAGE_TEXT = ‘Commande
SET info_1 = valeur_1, introuvable’;
END IF ;
info_2= valeur_2, etc; - - suite de code a exécuter si pas d’erreur
PARTIE 1
--…
▪ Info pour prendre : END
MESSAGE_TEXT, MYSQL_ERRNO , SCHEMA_NAME,
nom_table, COLUMN_NAME,
L’instruction RESIGNAL
▪ l'instruction RESIGNAL est similaire à l'instruction
DELIMITER $$
SIGNAL en termes de fonctionnalité et de syntaxe,
CREATE PROCEDURE Divide (IN numerator INT,
sauf que : IN denominator INT,
OUT result double)
▪ On doit utiliser l'instruction RESIGNAL dans un BEGIN
gestionnaire d'erreurs ou d'avertissements, DECLARE division_by_zero CONDISTION FOR SQLSTATE ‘22012’ ;
DECLARE CONTINUE HANDLER FOR division_by_zero
sinon on obtient un message d'erreur « RESIGNAL SET MESSAGE_TEXT = ‘Division by zero / Denominator cannot be
RESIGNAL lorsque le gestionnaire n'est pas actif zero’;
--
». Notons qu’on peut utiliser l'instruction IF denominator = 0 THEN
SIGNAL division_by_zero;
SIGNAL n'importe où dans une procédure ELSE
stockée. SET result := numerator / denominator;
END IF ;
▪ On peut omettre tous les attributs de END
PARTIE 1
Définition
▪ Un curseur est une zone mémoire qui est générée côté serveur (mise en cache) et qui permet de traiter individuellement
chaque ligne renvoyée par un SELECT.
▪ Un sous-programme peut travailler avec plusieurs curseurs en même temps. Un curseur, durant son existence (de l’ouverture
à la fermeture), contient en permanence l’adresse de la ligne courante.
▪ Tout curseur MySQL dispose des propriétés suivantes :
Read-only (lecture seule)
▪ Aucune modification dans la base n’est possible à travers ce dernier (sauf si on ajoute la clause FOR
UPDATE) ;
précédent ;
Asensitive (insensible )
▪ Toute mise à jour opérée dans la base de données n’est pas répercutée dans le curseur une fois ouvert
(utilise une copie temporaire des données et ne pointe pas sur les données réelles.
Copyright - Tout droit réservé - OFPPT 68
01 – Maitriser le langage de programmation
procédurale sous MySQL
Les curseurs
Syntaxe
DELIMITER $$
Exemple
CREATE PROCEDURE lister_clients (INOUT resultat_txt VARCHAR(4000))
▪ Ce curseur permet de construire une chaine contenant BEGIN
les emails des employés. DECLARE finished INTEGER DEFAULT 0 ;
▪ Remarques : DECLARE v_id INT ;
DECLARE v_nom VARCHAR (100) ;
▪ Un curseur doit toujours être associé à une DECLARE v_prenom VARCHAR (100) ;
instruction SELECT. DECLARE info VARVHAR (400) DEFAULT ‘’’’ ;
▪ Lorsque on travaille avec le curseur MySQL, on doit DECLARE cur_info_client CURSOR FOR SELECT id,nom,prenom FROM clients;
également déclarer un gestionnaire NOT FOUND DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
pour gérer la situation où le curseur ne trouve OPEN cur_info_client ;
boucle_parcours_clients : LOOP
aucune ligne.
FETCH cur_info_client INTO v_id, v_nomn v_prenom ;
- - Appel de la ps IF finished = 1 THEN
SET @resultat_txt = ‘’’’; LEAVE boucle_parcours_clients ;
END IF ;
PARTIE 1
CALL lister_clients(@resltat_txt) ;
SELECT @resultat_txt ; SET info = CONCAT (v_id, ’’-’’,v_nom,’’-’,v_prenom);
SET resultat_txt = CONCAT (info, ’’;’’,resultat_txt) ;
END LOOP boucle_parcours_clients ;
CLOSE cur_info_client;
END $$
Copyright - Tout droit réservé - OFPPT 70
01 – Maitriser le langage de programmation
procédurale sous MySQL
Les curseurs
Restrictions d’utilisation
Il n’est pas possible de déclarer un curseur FOR UPDATE en utilisant dans la requête les directives :
▪ DISTINCT ;
▪ GROUP BY;
▪ Un opérateur ensembliste ;
▪ Une fonction d’agrégat.
PARTIE 1
Définition
▪ Un déclencheur est une procédure stockée, dans la base de données, qui s'appelle automatiquement à chaque fois
qu'un événement spécial se produit sur la table à laquelle le déclencheur est attaché.
▪ Un déclencheur peut être utilisé pour valider les données, enregistrer les anciennes et les nouvelles valeurs dans une
table d'audit (log) ou s'assurer que les règles métier sont respectées.
▪ Par exemple, un déclencheur peut être invoqué lorsqu'une ligne est insérée dans une table spécifique ou lorsque
certaines colonnes de la table sont mises à jour.
PARTIE 1
Syntaxe
Types
Exemple
PARTIE 1
Avantages
Aux tâches qui peuvent être exécutées automatiquement lorsque le déclencheur se déclenche
plutôt que d'être planifiées.
PARTIE 1
À auditer les changements de données, enregistrer les événements et aider à prévenir les
transactions invalides.
On ne peut avoir qu'un seul déclencheur par événement ; On ne peut avoir qu'un seul déclencheur BEFORE UPDATE
sur une table donnée, mais on peut y exécuter plusieurs instructions ;
Ils ne peuvent pas utiliser l'instruction CALL et ils ne peuvent pas créer de tables ou de vues temporaires ;
Les déclencheurs peuvent entraîner des résultats incohérents en fonction de plusieurs facteurs, notamment le type
de moteur de base de données (InnoDB, MyISAM,..) utilisé avec la table à laquelle le déclencheur a été attribué.
PARTIE 1
OLD/NEW
▪ le mot-clé OLD est utilisé pour accéder aux données de ligne qui sont remplacées par la mise à jour.
▪ Le mot-clé NEW permet d'accéder aux données de ligne entrantes qui remplaceront l'ancienne ligne, en cas de succès.
▪ Selon le type de déclencheur créé, les lignes OLD et NEW peuvent ne pas être disponibles :
▪ INSERT TRIGGER : Accès possible a New uniquement.
▪ UPDATE TRIGGER : Accès aux deux pseudo-lignes NEW et OLD
▪ DELETE TRIGGER : Accès uniquement a OLD pseudo-lignes, c'est-à-dire qu'il n'y a pas de ligne OLD sur un
déclencheur INSERT et pas de ligne NEW sur un déclencheur DELETE.
PARTIE 1
- - Creation du trigger
DROP TRIGGER IF EXISTS mise_ajour_moyenne_age ;
DELIMITER //
CREATE TRIGGER mise_ajour_moyenne_age AFTER INSERT
ON clients
FOR EACH ROW
UPDATE moyenne_age SET moyenne = age SELECT (AVG (TIMESTAMPDIFF(YEAR, date_naissance, CURDATE())) FROM clients ;
DELIMITER ;
PARTIE 1
- - déclencher le triger
INSERT INTO clients (nom, prenom, date_naissance, adresse)
VALUES (‘’Dadi’’,’’Hamza’’,’’2000-5-22’’,’’casa’’);
- - afficher la nouvelle valeur de l’age moyen
SELECT * FROM moyenne_age;
Copyright - Tout droit réservé - OFPPT 84
01 – Maitriser le langage de programmation
procédurale sous MySQL
Les déclencheurs (Trigger)
- - tester le trigger
UPDATE Clients SET date_naissance = ‘2010-9-23’
WHERE id = 6;
UPDATE Clients SET date_naissance = ‘1999-9-23’
WHERE id = 7;
Copyright - Tout droit réservé - OFPPT 85
01 – Maitriser le langage de programmation
procédurale sous MySQL
Les déclencheurs (Trigger)
DELIMITER //
▪ Ce déclencheur after_sales_update est
automatiquement déclenché avant qu'un CREATE TRIGGER after_sales_update AFTER UPDATE
événement de mise à jour ne se produise ON sales
pour chaque ligne de la table des FOR EACH ROW
ventes(sales). BEGIN
IF OLD.quantity <> NEW.quantity THEN
▪ Si on met à jour la valeur dans la colonne
INSERT INTO SalesChanges (salesId, beforeQuantity, afterQuantity)
de quantité à une nouvelle valeur, le VALUES (OLD.id, OLD.quantity, NEW.quantity) ;
déclencheur insère une nouvelle ligne END IF ;
pour consigner les modifications dans la END $$
table SalesChanges.
PARTIE 1
DELIMITER ;
DELIMITER //
DELIMITER ;
PARTIE 1
Ce déclencheur permet après la suppression d’un CREATE TRIGGER after_salaries_delete AFTER DELETE
salaire de mettre à jour le budget des salaires ON salaries
FOR EACH ROW
stockée dans la table SalaryBudgets.
UPDATE SalaryBudgets
SET total = total - OLD.salary;
PARTIE 1
• Remarque : Si on supprime une table, MySQL supprimera automatiquement tous les déclencheurs
associés à la table.
PARTIE 1
UNLOCK TABLES ;
Conseils
Éviter si possible les SELECT * et réduire le nombre de champs, afin de réduire les données chargées en mémoire ;
Éviter d'utiliser des fonctions dans les prédicats : exemple SELECT * FROM TABLE1 WHERE UPPER(COL1)='ABC‘ ;
Utiliser la jointure interne (inner join), au lieu de la jointure externe (outer join) si possible ;
Compter les requêtes sur chaque page, un grand nombre de requêtes peut signifier un « problème N+1 », c’est à dire une requête SELECT placée dans
PARTIE 1
une boucle ;
Utiliser les requêtes préparées ou les procédures stockées facilite la mise en cache des requêtes en interne par MySQL et assure un bon niveau de
sécurité ;
Utiliser la clause EXPLAIN pour comprendre le fonctionnement d’une requête et quelles sont les clauses qui impactent ses performances.
Instruction préparée
DEALLOCATE
PREPARE EXECUTE
PREPARE
Les Index
▪ Comme l’index d’un ouvrage vous aide à atteindre les pages concernées par un mot recherché, un index MySQL permet
d’accélérer l’accès aux données d’une table.
▪ La plupart des index de MySQL (PRIMARY KEY, UNIQUE, INDEX, et FULLTEXT) sont stockés dans des arbres équilibrés
(balanced trees : B-trees).
▪ D’autres types d’index existent, citons ceux qui portent sur des colonnes SPATIAL (reverse key : R-trees), et ceux appliqués
aux tables MEMORY (tables de hachage : hash).
▪ L'optimiseur de requête peut utiliser des index pour localiser rapidement les données sans avoir à analyser chaque ligne
d'une table pour une requête donnée.
▪ Lorsqu’on crée une table avec une clé primaire ou une clé unique, MySQL crée automatiquement un index spécial
PARTIE 1
Les Index
Création d’index
USE eshop_app_db;
CREATE UNIQUE INDEX idx_clients_adresse USING BTREE
ON clients (adresse DESC);
Copyright - Tout droit réservé - OFPPT 97
02 - Optimiser une base de données MySQL
Les Index
Avantages
Les Index
Avantage
Comme nous pouvons le voir, MySQL n'a eu qu'à localiser 1 ligne à partir de l'index nom_index comme indiqué
dans la colonne clé sans parcourir toute la table.
PARTIE 1
Les Index
Stratégie d'indexation
Les points importants qu’on doit prendre en compte dans votre stratégie d'indexation sont les suivants :
▪ Créer une clé primaire (généralement, la colonne se terminera par id) ;
▪ Prédir les colonnes qui seront souvent interrogées dans votre application avec WHERE, GROUP BY, HAVING et
Clauses ORDER BY ;
▪ Avoir un index sur les colonnes qui seront utilisées avec des fonctions, telles que SUM (), COUNT (), MIN (),
MAX () et AVG (); pour en bénéficier en termes de performances;
▪ Ne surcharger pas la base de données avec trop d'index, car cela aura un impact sur les performances des clés
secondaires MySQL;
▪ Prédire avec des index uniques pour accélérer les requêtes de jointure (généralement, les colonnes qui se
PARTIE 1
Définition
▪ La sécurité des bases de données fait référence à la gamme d'outils, de contrôles et de mesures conçus pour
établir et préserver la confidentialité, l'intégrité et la disponibilité des bases de données;
▪ La sécurité de la base de données doit traiter et protéger les éléments suivants :
6- Mettre à jour les 7- Utiliser une 8- Attribuer des rôles 9- Éviter d'utiliser les
applications authentification de sécurité à tous les ports réseau par
régulièrement utilisateur forte utilisateurs défaut
▪ Il est essentiel d'effectuer des sauvegardes régulières de la base de données pour pouvoir la récupérer en cas
de perte.
▪ L'outil mysqldump permet de faire une sauvegarde d'une ou plusieurs bases de données en générant un
fichier texte contenant des instructions SQL qui peuvent recréer les bases de données à partir de zéro.
PARTIE 1
Étape 1
Étape 2
1-création utilisateur:
1-création utilisateur:
▪ Il est également possible de permettre à un utilisateur de se connecter à partir de plusieurs hôtes différents (sans devoir
créer un utilisateur par hôte) : en utilisant le joker %
- - Said peut se connecter à partir de n’importe quel hôte dont l’adresse IP commence par 194.28.12
CREATE USER ‘Said ‘@’ 194.28.12.% ‘ IDENTIFIED BY ‘baskeball18’ ;
▪ Pour se connecter à MySQL avec les informations d'identification d’un utilisateur, on utilise cette commande en invite de
commande:
mysql -h <host> -u <user> -p <db>
PARTIE 1
2 – Renommer un utilisateur
3 – Supprimer un utilisateur
Les privilèges
▪ Lorsque l’on crée un utilisateur avec CREATE USER, celui-ci n’a au départ aucun privilège, aucun droit ;
▪ En SQL, avoir un privilège, c’est avoir l’autorisation d’effectuer une action sur un objet. Il existe de nombreux
privilèges ;
▪ Les privilèges SELECT, INSERT, UPDATE ,DELETE, CREATE TABLE, CREATE TEMPORARY TABLE , CREATE VIEW, ALTER
TABLE, DROP, CREATE ROUTINE, LOCK TABLES,…etc, permettent aux utilisateurs d’exécuter ces mêmes commandes
▪ Il y a différents niveaux d’application des privilèges :
Globale • *.*
Table • [nom_bd].[nom_table]
▪ Pour pouvoir ajouter un privilège à un utilisateur, il faut posséder le privilège GRANT OPTION.
▪ Au début , seul l’utilisateur « root » le possède.
▪ Pour attribuer des privilèges à un utilisateur, on utilise :
GRANT privilege1 [( liste_colonnes )] [, privilege2 [(liste_colonnes )], ...] ON [ type_objet ] niveau_privilege TO utilisateur
[ IDENTIFIED BY mot_de_passe ];
PARTIE 1
GRANT SELECT ,
UPDATE (nom, prenom, adresse ) ,
DELETE ,
INSERT
ON eshop_app_db.clients
TO saadi@localhost ;
ON *.*
TO saadi@localhost ;
▪ Si un rôle est accordé à un utilisateur, on doit peut-être indiquer à MySQL quels rôles vous souhaitez utiliser à l'aide de la
requête suivante: SET ROLE ‘webdeveloper’.