top of page

Les triggers (ou déclencheurs)

  • Photo du rédacteur: MYPE SAS
    MYPE SAS
  • 9 mai
  • 3 min de lecture

Dernière mise à jour : 24 juil.

En SQL, les triggers (ou déclencheurs) sont des procédures associées à une base de données, qui exécutent automatiquement une ou plusieurs actions lorsqu’un événement se produit dans une table ou une vue. Un trigger peut être par exemple de mettre à jour d’autres tables lorsqu’une donnée change, d’empêcher certaines actions de se produire, d’incrémenter un compteur ou un journal de log…

 

Exemple :

 

On va chercher à ajouter une ligne dans une table factures, en ayant vérifié auparavant à l’aide d’un trigger, si la facture n’existe pas déjà. Si elle existe déjà, l'insertion est annulée et un message d'erreur est généré. Voici le code MySQL correspondant :


CREATE TRIGGER ctrl_facture

BEFORE INSERT ON factures

FOR EACH ROW

BEGIN

    IF EXISTS (SELECT 1

          FROM factures

          WHERE numero_facture = NEW.numero_facture)

    THEN

        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Le numéro de facture existe déjà.';

    END IF;

END;

 

Voici le retour de l’exécution de ce code :

triggers déclencheur SQL

Essayons maintenant d’insérer une ligne dans la table factures, pour laquelle une ligne avec le même numero_facture se trouve déjà dans la table. On obtient :

ree

Explication du code :

 

CREATE TRIGGER ctrl_facture : crée un trigger nommé ctrl_facture.

 

BEFORE INSERT ON factures: Le trigger est exécuté avant qu'une nouvelle ligne ne soit insérée dans la table factures. Il est possible de créer des triggers sur des DELETE, UPDATE… Les triggers peuvent être configurés pour s’exécuter aussi après que l’événement ait lieu, dans ce cas c’est la clause AFTER qui sera utilisée.

 

FOR EACH ROW : Le trigger s'applique à chaque ligne qui est insérée. Les triggers peuvent s’appliquer sur un ensemble de lignes directement et non ligne par ligne. Dans ce cas, c’est la clause FOR EACH STATEMENT qui sera utilisée.

 

IF EXISTS (SELECT 1 FROM factures WHERE numero_facture = NEW.numero_facture) : Cette condition vérifie si le numéro de facture (stocké dans la colonne numero_facture de la ligne en cours d'insertion) existe déjà dans la table factures. Le concept de NEW est décrit plus bas dans cet article.

 

SIGNAL SQLSTATE '45000' : Si le numéro de facture existe déjà, le trigger lance une erreur personnalisée avec le message 'Le numéro de facture existe déjà.'. Cela empêche l'insertion de la nouvelle facture. Le code 45000 fait partie du standard SQL pour indiquer une exception générée par l'utilisateur.

 

END IF; : Fin de la condition IF.


Cas d’utilisation des triggers :

 

Automatiser la mise à jour de tables associées : Si une ligne est référencée dans une autre table, un trigger permet de mettre à jour cette table lorsque la ligne référencée est modifiée.

 

Enregistrer une date/heure de connexion ou de modification dans une table : Un trigger peut permettre l’enregistrement dans une table, des connexions et actions effectuées par un utilisateur.

 

Envoyer des notifications : Un trigger peut exécuter un script par exemple, en utilisant un langage comme Python, pour envoyer un e-mail.

 

Créer un compteur : Un trigger peut compter le nombre d’enregistrements effectués par jour dans une table.

 

Faire respecter des règles de gestion : Un trigger peut contrôler que toutes les données d’une colonne restent uniques.


Inconvénients des triggers :

 

Malgré leurs avantages, les triggers peuvent aussi présenter certains inconvénients :

 

  • Les triggers peuvent rendre la gestion de la base de données plus complexe et moins performante, notamment si plusieurs triggers sont définis sur les mêmes tables ou si un trigger en appelle un autre. En effet, chaque fois qu'une opération (INSERT, UPDATE, DELETE) est effectuée, les triggers associés sont exécutés, ce qui rend le processus plus complexe à comprendre et ce qui peut ralentir le processus.

 

  • Il est souvent difficile de déboguer les triggers, car ils sont exécutés de manière implicite et automatique. Vous pouvez ne pas voir directement l'impact d’un trigger si une erreur se produit, ce qui rend les problèmes plus difficiles à résoudre.

 

Il peut être intéressant, dans le cadre d’un développement d’application, d’associer le travail des triggers avec des scripts (Python par exemple) dans le code de l’application. Cela permet de bénéficier de la flexibilité du code, de la séparation des préoccupations et de la visibilité du débogage tout en bénéficiant de la performance des triggers. Bien sûr, tout cela demande de l’organisation.


Les pseudo-tables NEW et OLD :

 

NEW et OLD dans les triggers SQL sont des tables virtuelles (ou pseudo-tables). Elles n’existent que pendant le temps d’exécution du trigger. Elles contiennent les données anciennes ou nouvelles. 

 

NEW représente la nouvelle version d'une ligne (dans un INSERT ou un UPDATE). NEW permet de modifier les lignes d’une table.

 

OLD représente l'ancienne version d'une ligne (dans un UPDATE ou un DELETE). Les données de OLD peuvent être conservées dans une autre table pour avoir un historique des changements.


--

Retrouvez toutes nos formations en SQL.

 
 
 

Commentaires


bottom of page