~~SLIDESHOW~~
====== D4-C03 : Première approche de la programmation au sein d’un SGBD - La gestion d'événements en SQL ======
On peut utiliser un langage de programmation associé à un SGBD, la programmation d’événements
(events) en est une illustration. Elle permet de planifier dans le temps l'exécution d'un traitement à
renouveler éventuellement de façon périodique.
===== Objectifs =====
* revoir la gestion des dates
* découvrir la gestion d'évènements avec le SGBD MariaDB
* automatiser des traitements planifiés
* mettre en oeuvre aves des exercices pratiques
===== Les formats de dates avec MariaDB =====
MariaDB propose plusieurs types de données pour gérer les dates et heures :
* DATE : date (AAAA-MM-JJ)
* DATETIME : date + heure (AAAA-MM-JJ HH:MM:SS)
* TIME : durée ou heure du jour
* TIMESTAMP : similaire à DATETIME mais dépend du fuseau horaire
* YEAR : année sur 4 chiffres
Ressource utile : https://mariadb.com/kb/en/date-time-functions/
===== Manipuler les dates =====
Quelques fonctions utiles :
* SELECT NOW(); -- date et heure actuelles
* SELECT CURDATE(); -- date actuelle
* SELECT DATE_ADD(NOW(), INTERVAL 100 DAY); -- +100 jours
* SELECT DATE_FORMAT(NOW(), '%W %d %M %Y'); -- mise en forme
* SELECT YEAR(champDate);
* SELECT MONTH(champDate);
* ...
Exemples avec des valeurs de dates précises :
* SELECT YEAR('2017-03-20') as Année; -> 2017
* SELECT MONTH('2017-03-20') as Mois; -> 3
* SELECT DAY('2017-03-20') as Jour; -> 20
* SELECT WEEKDAY('2017-03-20') as JourSemaine; -> 0 (=lundi, 6=dimanche)
* SELECT DAYOFWEEK('2017-03-20') as JourSemaine; -> 2 (=lundi,1=dimanche)
* SELECT HOUR('2017-03-20 00:47:49') as Heures; -> 0
* SELECT MINUTE('2017-03-20 00:47:49') as Minutes; -> 47
* SELECT SECOND('2017-03-20 00:47:49') as Secondes; -> 49
* Mettre en forme une valeur de date : SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y') -> Sunday October 2009 (jour mois année)
===== =====
==== Exercices sur les dates ====
=== Gestion commerciale ===
{{:promo_2026:sio2:slam:d3:bdcomactivite.png?600|schéma bd}}
- Quels clients ont acheté un produit l'année dernière ?
- Quels clients ont acheté un produit depuis moins de 180 jours ?
- Quels clients n'ont rien acheté ce mois-ci ?
- Trouver tous les achats réalisés au cours des 30 derniers jours.
- Calculer combien de jours se sont écoulés depuis la dernière commande de chaque client.
===== =====
=== Indépendamment de la base précédente : ===
- Écrire une requête qui ajoute 6 mois à la date actuelle.
- Afficher la date du premier jour du mois précédent (Par exemple, si nous sommes le 20 mars 2017, la requête doit afficher 1er février 2017 - cette réponse est éligible à la qualité de réponse parfaite si elle fonctionne même en janvier)
- Afficher la date du prochain jeudi (le langage SQL peut utiliser des structures conditionnelles, effectuez des recherches !)
===== La programmation d’événements =====
La programmation d’événements (events) permet de planifier dans le temps l'exécution d'un traitement à
renouveler éventuellement de façon périodique. Ils nécessitent que le planificateur d’événements (event_scheduler) soit activé.
===== =====
==== Utilité ====
Voici quelques exemples de tâches que vous pourrez mettre en œuvre, sans avoir à passer par des artifices de programmation de plus ou moins bonnes qualités. Vous pourrez, par exemple :
* Programmer des requêtes de suppression pour délester de vieilles discussions sur un forum.
* Calcul annuel d'intérêt.
* Programmer des requêtes de sauvegardes automatiques chaque nuit.
* Différer l'exécution d'un traitement gourmand en ressources aux heures creuses de la prochaine nuit.
* Analyser et optimiser l'ensemble des tables mises à jour dans la journée
* …
===== =====
==== Prérequis ====
* Le programmateur d’événements (event scheduler) doit être actif
* L'utilisateur doit avoir le privilège SUPER (au niveau global) pour avoir l'autorisation d'exécuter des commandes d'administration et de débogage.
* Pour définir un événement dans une base, l'utilisateur doit avoir le privilège EVENT.
__Vérification__ : SHOW VARIABLES LIKE 'event_scheduler';
__Activation__ : SET GLOBAL event_scheduler = ON;
===== =====
==== Syntaxe de création d’un événement ====
CREATE EVENT [IF NOT EXISTS] [nom_base].nom_evenement
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'commentaire']
DO instructions_sql;
===== =====
--Exemple
CREATE EVENT nom_evenement
ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP
DO
instruction_sql;
===== =====
//**schedule**// précise la planification (instant initial, période, instant final) selon le modèle suivant :
* AT timestamp [+ INTERVAL intervalle] 🡪 exécution unique (événement ponctuel)
* EVERY intervalle 🡪 répéter l'exécution périodiquement (événement périodique)
* [STARTS timestamp] : début événement
* [ENDS timestamp] : fin événement
* timestamp désigne un instant au format TIMESTAMP ou DATETIME(précision à la seconde)
* intervalle est le délai exprimé sous la forme d'une ou plusieurs expressions séparées par '+' quantite {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
* ON COMPLETION renseigne sur le fait de supprimer l'événement après son exécution, par défaut NOT PRESERVE, l'événement expiré est détruit.
===== =====
==== Exemple de planification (schedule) ====
^N° ^clause ON SCHEDULE ^l'événement s'exécute ... (à compléter)^
|1 |AT '2019-10-2 10:59:00' | |
|2 |AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR | |
|3 |AT CURRENT_TIMESTAMP + INTERVAL 3 WEEK + INTERVAL 2 DAY| |
|4 |EVERY 1 DAY STARTS '2019-10-2 4:00:00' | |
|5 |EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + INTERVAL 1 WEEK | |
|6 |EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK| |
===== Activité =====
[[d4:A04]]