Ceci est une ancienne révision du document !
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
Note: 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);
Exercices sur les dates
Gestion commerciale
- 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 :
- 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 2017-2-01 - 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 !)
- Afficher la date du premier jour du mois précédent.
- Afficher la date du prochain lundi.
- Écrire une requête qui ajoute 6 mois à la date actuelle.
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 |