420-5D3 : BD – Déclencheur

1 octobre 2023

Définition

Les déclencheurs (ou « triggers » en anglais) sont des objets de base de données qui réagissent automatiquement à certains événements ou actions qui se produisent dans la base de données. Ils sont utilisés pour automatiser des tâches, appliquer des règles métier (normes et standards), garantir la cohérence des données et effectuer des actions spécifiques lors de la modification d’une table ou d’une vue.

Ils peuvent être déclenchés par des événements tels que les opérations d’insertion, de mise à jour ou de suppression de données.


SYNTAXE

La syntaxe de base des déclencheurs (triggers) dans Oracle suit un modèle standard.

Voici la structure de base d’un déclencheur Oracle :

CREATE OR REPLACE TRIGGER nom_du_declencheur
{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE | {INSERT OR} UPDATE | {INSERT OR} DELETE}
ON nom_de_la_table
[REFERENCING {OLD AS old | NEW AS new}]
[FOR EACH {ROW | STATEMENT}]
DECLARE
  -- Déclarations de variables locales
BEGIN
  -- Logique du déclencheur
  -- Instructions SQL, conditions, logique métier, etc.
EXCEPTION
  WHEN nom_de_l_exception THEN
    -- Gestion des exceptions (facultatif)
END nom_du_declencheur;
/

Explications des éléments clés de la syntaxe :

Cette structure de base permet de créer des déclencheurs Oracle pour automatiser des actions ou appliquer des règles métier en réponse à des modifications de données spécifiques dans une table. Il est possible de personnaliser davantage la logique du déclencheur en fonction des besoins de l’application.


Exemples d’utilisation de déclencheurs:

  1. Déclencheur de vérification d’intégrité : Exemple : Supposons que vous souhaitiez vous assurer que le montant d’une commande ne dépasse pas le crédit disponible d’un client avant d’insérer une nouvelle commande. Vous pouvez créer un déclencheur pour cela.
   CREATE OR REPLACE TRIGGER VerifierCredit
   BEFORE INSERT ON Commandes
   FOR EACH ROW
   DECLARE
     v_credit_disponible NUMBER;
   BEGIN
     SELECT CreditDisponible INTO v_credit_disponible
     FROM Clients
     WHERE IDClient = :NEW.IDClient;

     IF :NEW.MontantCommande > v_credit_disponible THEN
       RAISE_APPLICATION_ERROR(-20001, 'Crédit insuffisant.');
     END IF;
   END VerifierCredit;
  1. Déclencheur de journalisation des modifications : Exemple : Vous pouvez créer un déclencheur pour enregistrer chaque mise à jour effectuée sur une table dans un journal de modifications.
   CREATE OR REPLACE TRIGGER JournalisationModifications
   AFTER UPDATE ON MaTable
   FOR EACH ROW
   BEGIN
     INSERT INTO JournalModifications (TableModifiee, DateModification, Utilisateur)
     VALUES ('MaTable', SYSTIMESTAMP, USER);
   END JournalisationModifications;
  1. Déclencheur de génération automatique de clés : Exemple : Pour générer automatiquement un numéro de commande unique pour chaque nouvelle commande insérée dans une table, vous pouvez utiliser un déclencheur.
   CREATE OR REPLACE TRIGGER GenererNumeroCommande
   BEFORE INSERT ON Commandes
   FOR EACH ROW
   BEGIN
     SELECT ma_sequence.NEXTVAL INTO :NEW.NumeroCommande FROM dual;
   END GenererNumeroCommande;
  1. Déclencheur de validation des données : Exemple : Vous pouvez créer un déclencheur pour valider les données avant leur insertion dans une table, par exemple, pour vous assurer que les dates de début et de fin d’une réservation sont valides.
   CREATE OR REPLACE TRIGGER ValiderDatesReservation
   BEFORE INSERT ON Reservations
   FOR EACH ROW
   BEGIN
     IF :NEW.DateDebut > :NEW.DateFin THEN
       RAISE_APPLICATION_ERROR(-20002, 'La date de début doit précéder la date de fin.');
     END IF;
   END ValiderDatesReservation;
  1. Déclencheur de synchronisation des données : Exemple : Supposons que vous ayez une table principale « Produits » et une table de référence « Stocks » qui stocke la quantité de chaque produit en stock. Vous souhaitez mettre à jour automatiquement la quantité en stock dans la table « Stocks » chaque fois qu’une modification est apportée à la table « Produits ».
   CREATE OR REPLACE TRIGGER SynchroniserDonnees
   AFTER INSERT OR UPDATE OR DELETE ON Produits
   FOR EACH ROW
   BEGIN
     IF INSERTING THEN
       -- Si une nouvelle ligne est insérée dans la table Produits,
       -- mettez à jour la table Stocks avec la nouvelle quantité en stock.
       INSERT INTO Stocks (IDProduit, QuantiteEnStock)
       VALUES (:NEW.IDProduit, :NEW.Quantite);
     ELSIF UPDATING THEN
       -- Si une ligne existante est mise à jour dans la table Produits,
       -- mettez à jour la table Stocks avec la nouvelle quantité en stock.
       UPDATE Stocks
       SET QuantiteEnStock = :NEW.Quantite
       WHERE IDProduit = :NEW.IDProduit;
     ELSIF DELETING THEN
       -- Si une ligne est supprimée dans la table Produits,
       -- supprimez également l'entrée correspondante dans la table Stocks.
       DELETE FROM Stocks WHERE IDProduit = :OLD.IDProduit;
     END IF;
   END SynchroniserDonnees;

Dans cet exemple, le déclencheur SynchroniserDonnees est déclenché après toute opération d’insertion, de mise à jour ou de suppression dans la table « Produits ». En fonction de l’action effectuée, il met à jour automatiquement la table « Stocks » pour maintenir la cohérence des données entre les deux tables.

Notez que cet exemple est simplifié à des fins d’illustration. Dans un environnement de production réelle, la logique de synchronisation peut être plus complexe et tenir compte de plusieurs facteurs, tels que la gestion des transactions, la gestion des erreurs, etc.


Ces exemples mettent en lumière la polyvalence des déclencheurs d’une base de données, qui permettent d’automatiser des actions, de garantir l’intégrité des données et de maintenir la cohérence des données dans la base de données. Les déclencheurs sont un élément essentiel de la gestion de base de données pour garantir la fiabilité des données et l’application des règles métier.


LABORATOIRE