Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Déclencheurs | Quelques Sujets Supplémentaires
Optimisation SQL et Fonctionnalités de Requête

Déclencheurs

Glissez pour afficher le menu

Déclencheurs dans les bases de données sont des types spéciaux de procédures stockées qui sont exécutées automatiquement ou déclenchées en réponse à certains événements ou actions se produisant dans la base de données.
Ces événements peuvent inclure des insertions, des mises à jour ou des suppressions de données dans les tables ainsi que des modifications des objets du schéma de la base de données comme les tables ou les vues.

Déclencheurs DML

Un déclencheur DML, également appelé déclencheur du langage de manipulation de données, est un objet de base de données qui exécute automatiquement une action spécifiée lorsqu'un certain événement se produit sur une table ou une vue.
Les déclencheurs DML sont souvent utilisés pour appliquer des règles métier, maintenir l'intégrité des données ou effectuer des tâches d'audit.

Types de déclencheurs DML

  • Déclencheurs After : Ces déclencheurs s'exécutent après l'action déclenchante (insertion, mise à jour, suppression) sur la table ;
  • Déclencheurs Before : Ces déclencheurs s'exécutent avant l'action déclenchante. Ils permettent d'intercepter l'action initiale et d'exécuter une logique personnalisée avant de décider de poursuivre ou non l'action initiale.

Exemple de déclencheur After

Nous avons précédemment exploré un exemple d'utilisation d'une transaction pour ajouter des valeurs à la table BankAccounts et à la table UserLogs comme une seule unité logique dans la première section de ce cours.
Désormais, au lieu d'utiliser une transaction, nous pouvons obtenir le même résultat en créant un déclencheur AFTER sur l'opération INSERT dans la table BankAccounts.
Ainsi, il sera uniquement possible d'insérer de nouveaux comptes, et la valeur du journal correspondante sera automatiquement ajoutée par le déclencheur.

12345678910111213141516
-- Create an after-insert trigger for UserLogs CREATE FUNCTION after_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Perform some action, like logging the insert INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('New record inserted for ', NEW.account_holder)); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Attach the trigger to the BankAccounts table CREATE TRIGGER after_insert_trigger AFTER INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE after_insert_trigger_function();
Description de la requête
expand arrow
  • Créer un déclencheur after insert pour user_logs :

    • Créer une fonction nommée afterinserttriggerfunction().
    • La fonction est définie pour retourner un déclencheur.
    • Le corps de la fonction commence par un bloc BEGIN.
    • À l'intérieur du bloc BEGIN, une action est effectuée, qui consiste à insérer un enregistrement dans la table userlogs.
    • L'enregistrement inséré contient des valeurs issues de la ligne NEW de l'événement déclencheur.
    • Les valeurs insérées incluent accountnumber et une chaîne concaténée mentionnant l'action.
    • La fonction retourne la ligne NEW.
    • La fonction est écrite dans le langage plpgsql.
  • Attacher le déclencheur à la table bankaccounts :

    • Un déclencheur nommé afterinserttrigger est créé.
    • Le déclencheur est configuré pour s'exécuter après une opération INSERT sur la table bankaccounts.
    • Le déclencheur est configuré pour exécuter la fonction afterinserttriggerfunction pour chaque ligne affectée.
Note
Remarque

Dans les triggers PostgreSQL, NEW est une variable d'enregistrement spéciale représentant la nouvelle ligne insérée ou mise à jour dans la table. Elle permet d'accéder aux valeurs des colonnes de la nouvelle ligne à l'intérieur de la fonction du trigger.
Si l'on travaille avec des lignes supprimées, il faut utiliser la variable d'enregistrement OLD à la place de NEW.

Exemple de trigger BEFORE

Supposons que l'on souhaite empêcher l'ajout de valeurs avec un solde de compte négatif. Il est possible de créer un trigger BEFORE pour cela. Ce trigger vérifiera le solde avant l'opération et, s'il est négatif, l'opération ne sera pas effectuée.

12345678910111213141516171819202122232425
-- Create the trigger function CREATE FUNCTION before_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Check if the account balance is less than 0 IF (NEW.balance < 0) THEN -- If balance is less than 0, do nothing and return RAISE NOTICE 'Balance is less than 0. Action not logged.'; ELSE -- If balance is greater than or equal to 0, log the action RAISE NOTICE 'Logging insert into UserLogs'; -- Inserting into the UserLogs table INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('Account created for ', NEW.account_holder)); END IF; -- Indicate that the trigger function has completed successfully RETURN NULL; END; $$ LANGUAGE plpgsql; -- Create the trigger CREATE TRIGGER before_insert_trigger BEFORE INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE before_insert_trigger_function();
Description de la requête
expand arrow
  • Créer la fonction de trigger :

    • Créer ou remplacer une fonction nommée before_insert_userlogs().
    • La fonction est définie pour retourner un trigger.
    • Le corps de la fonction commence par un bloc BEGIN.
    • À l'intérieur du bloc BEGIN, une condition vérifie si le solde du compte est inférieur à 0.
    • Si le solde est inférieur à 0, un message d'information est affiché et aucune action n'est enregistrée. La fonction retourne NULL pour empêcher l'insertion.
    • Si le solde est supérieur ou égal à 0, un message d'information est affiché indiquant que l'action est enregistrée.
    • La fonction insère ensuite un enregistrement dans la table userlogs, contenant les valeurs de la nouvelle ligne (NEW).
    • Les valeurs insérées incluent accountnumber et une chaîne concaténée indiquant l'action.
    • La fonction retourne NEW pour permettre la poursuite de l'insertion.
    • La fonction est écrite en langage plpgsql.
  • Créer le trigger :

    • Un trigger nommé before_insert_userlogs_trigger est créé.
    • Le trigger est configuré pour s'exécuter avant une opération INSERT sur la table bankaccounts.
    • Le trigger est configuré pour exécuter la fonction before_insert_userlogs() pour chaque ligne affectée.

Modèle de création de trigger

On peut observer le modèle typique pour la création de triggers : initialement, on définit une fonction pour exécuter une logique spécifique avant ou après une opération. Ensuite, on associe cette fonction comme trigger à une table et une action désignées.

Veuillez noter que dans l'instruction :

CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;

nous avons la flexibilité d'utiliser UPDATE ou DELETE à la place de l'opération INSERT.
Mais attention : il n'est pas possible de créer des triggers sur SELECT car l'instruction SELECT ne modifie aucune ligne de la table !

question mark

Quel est le principal objectif de l'utilisation des triggers dans une base de données ?

Sélectionnez la réponse correcte

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 3. Chapitre 1

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Déclencheurs

Déclencheurs dans les bases de données sont des types spéciaux de procédures stockées qui sont exécutées automatiquement ou déclenchées en réponse à certains événements ou actions se produisant dans la base de données.
Ces événements peuvent inclure des insertions, des mises à jour ou des suppressions de données dans les tables ainsi que des modifications des objets du schéma de la base de données comme les tables ou les vues.

Déclencheurs DML

Un déclencheur DML, également appelé déclencheur du langage de manipulation de données, est un objet de base de données qui exécute automatiquement une action spécifiée lorsqu'un certain événement se produit sur une table ou une vue.
Les déclencheurs DML sont souvent utilisés pour appliquer des règles métier, maintenir l'intégrité des données ou effectuer des tâches d'audit.

Types de déclencheurs DML

  • Déclencheurs After : Ces déclencheurs s'exécutent après l'action déclenchante (insertion, mise à jour, suppression) sur la table ;
  • Déclencheurs Before : Ces déclencheurs s'exécutent avant l'action déclenchante. Ils permettent d'intercepter l'action initiale et d'exécuter une logique personnalisée avant de décider de poursuivre ou non l'action initiale.

Exemple de déclencheur After

Nous avons précédemment exploré un exemple d'utilisation d'une transaction pour ajouter des valeurs à la table BankAccounts et à la table UserLogs comme une seule unité logique dans la première section de ce cours.
Désormais, au lieu d'utiliser une transaction, nous pouvons obtenir le même résultat en créant un déclencheur AFTER sur l'opération INSERT dans la table BankAccounts.
Ainsi, il sera uniquement possible d'insérer de nouveaux comptes, et la valeur du journal correspondante sera automatiquement ajoutée par le déclencheur.

12345678910111213141516
-- Create an after-insert trigger for UserLogs CREATE FUNCTION after_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Perform some action, like logging the insert INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('New record inserted for ', NEW.account_holder)); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Attach the trigger to the BankAccounts table CREATE TRIGGER after_insert_trigger AFTER INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE after_insert_trigger_function();
Description de la requête
expand arrow
  • Créer un déclencheur after insert pour user_logs :

    • Créer une fonction nommée afterinserttriggerfunction().
    • La fonction est définie pour retourner un déclencheur.
    • Le corps de la fonction commence par un bloc BEGIN.
    • À l'intérieur du bloc BEGIN, une action est effectuée, qui consiste à insérer un enregistrement dans la table userlogs.
    • L'enregistrement inséré contient des valeurs issues de la ligne NEW de l'événement déclencheur.
    • Les valeurs insérées incluent accountnumber et une chaîne concaténée mentionnant l'action.
    • La fonction retourne la ligne NEW.
    • La fonction est écrite dans le langage plpgsql.
  • Attacher le déclencheur à la table bankaccounts :

    • Un déclencheur nommé afterinserttrigger est créé.
    • Le déclencheur est configuré pour s'exécuter après une opération INSERT sur la table bankaccounts.
    • Le déclencheur est configuré pour exécuter la fonction afterinserttriggerfunction pour chaque ligne affectée.
Note
Remarque

Dans les triggers PostgreSQL, NEW est une variable d'enregistrement spéciale représentant la nouvelle ligne insérée ou mise à jour dans la table. Elle permet d'accéder aux valeurs des colonnes de la nouvelle ligne à l'intérieur de la fonction du trigger.
Si l'on travaille avec des lignes supprimées, il faut utiliser la variable d'enregistrement OLD à la place de NEW.

Exemple de trigger BEFORE

Supposons que l'on souhaite empêcher l'ajout de valeurs avec un solde de compte négatif. Il est possible de créer un trigger BEFORE pour cela. Ce trigger vérifiera le solde avant l'opération et, s'il est négatif, l'opération ne sera pas effectuée.

12345678910111213141516171819202122232425
-- Create the trigger function CREATE FUNCTION before_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Check if the account balance is less than 0 IF (NEW.balance < 0) THEN -- If balance is less than 0, do nothing and return RAISE NOTICE 'Balance is less than 0. Action not logged.'; ELSE -- If balance is greater than or equal to 0, log the action RAISE NOTICE 'Logging insert into UserLogs'; -- Inserting into the UserLogs table INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('Account created for ', NEW.account_holder)); END IF; -- Indicate that the trigger function has completed successfully RETURN NULL; END; $$ LANGUAGE plpgsql; -- Create the trigger CREATE TRIGGER before_insert_trigger BEFORE INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE before_insert_trigger_function();
Description de la requête
expand arrow
  • Créer la fonction de trigger :

    • Créer ou remplacer une fonction nommée before_insert_userlogs().
    • La fonction est définie pour retourner un trigger.
    • Le corps de la fonction commence par un bloc BEGIN.
    • À l'intérieur du bloc BEGIN, une condition vérifie si le solde du compte est inférieur à 0.
    • Si le solde est inférieur à 0, un message d'information est affiché et aucune action n'est enregistrée. La fonction retourne NULL pour empêcher l'insertion.
    • Si le solde est supérieur ou égal à 0, un message d'information est affiché indiquant que l'action est enregistrée.
    • La fonction insère ensuite un enregistrement dans la table userlogs, contenant les valeurs de la nouvelle ligne (NEW).
    • Les valeurs insérées incluent accountnumber et une chaîne concaténée indiquant l'action.
    • La fonction retourne NEW pour permettre la poursuite de l'insertion.
    • La fonction est écrite en langage plpgsql.
  • Créer le trigger :

    • Un trigger nommé before_insert_userlogs_trigger est créé.
    • Le trigger est configuré pour s'exécuter avant une opération INSERT sur la table bankaccounts.
    • Le trigger est configuré pour exécuter la fonction before_insert_userlogs() pour chaque ligne affectée.

Modèle de création de trigger

On peut observer le modèle typique pour la création de triggers : initialement, on définit une fonction pour exécuter une logique spécifique avant ou après une opération. Ensuite, on associe cette fonction comme trigger à une table et une action désignées.

Veuillez noter que dans l'instruction :

CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;

nous avons la flexibilité d'utiliser UPDATE ou DELETE à la place de l'opération INSERT.
Mais attention : il n'est pas possible de créer des triggers sur SELECT car l'instruction SELECT ne modifie aucune ligne de la table !

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 3. Chapitre 1
some-alt