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();
-
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 tableuserlogs. - L'enregistrement inséré contient des valeurs issues de la ligne
NEWde l'événement déclencheur. - Les valeurs insérées incluent
accountnumberet une chaîne concaténée mentionnant l'action. - La fonction retourne la ligne
NEW. - La fonction est écrite dans le langage
plpgsql.
- Créer une fonction nommée
-
Attacher le déclencheur à la table bankaccounts :
- Un déclencheur nommé
afterinserttriggerest créé. - Le déclencheur est configuré pour s'exécuter après une opération
INSERTsur la tablebankaccounts. - Le déclencheur est configuré pour exécuter la fonction
afterinserttriggerfunctionpour chaque ligne affectée.
- Un déclencheur nommé
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();
-
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
accountnumberet une chaîne concaténée indiquant l'action. - La fonction retourne
NEWpour permettre la poursuite de l'insertion. - La fonction est écrite en langage
plpgsql.
- Créer ou remplacer une fonction nommée
-
Créer le trigger :
- Un trigger nommé
before_insert_userlogs_triggerest créé. - Le trigger est configuré pour s'exécuter avant une opération
INSERTsur la tablebankaccounts. - Le trigger est configuré pour exécuter la fonction
before_insert_userlogs()pour chaque ligne affectée.
- Un trigger nommé
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 !
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
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();
-
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 tableuserlogs. - L'enregistrement inséré contient des valeurs issues de la ligne
NEWde l'événement déclencheur. - Les valeurs insérées incluent
accountnumberet une chaîne concaténée mentionnant l'action. - La fonction retourne la ligne
NEW. - La fonction est écrite dans le langage
plpgsql.
- Créer une fonction nommée
-
Attacher le déclencheur à la table bankaccounts :
- Un déclencheur nommé
afterinserttriggerest créé. - Le déclencheur est configuré pour s'exécuter après une opération
INSERTsur la tablebankaccounts. - Le déclencheur est configuré pour exécuter la fonction
afterinserttriggerfunctionpour chaque ligne affectée.
- Un déclencheur nommé
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();
-
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
accountnumberet une chaîne concaténée indiquant l'action. - La fonction retourne
NEWpour permettre la poursuite de l'insertion. - La fonction est écrite en langage
plpgsql.
- Créer ou remplacer une fonction nommée
-
Créer le trigger :
- Un trigger nommé
before_insert_userlogs_triggerest créé. - Le trigger est configuré pour s'exécuter avant une opération
INSERTsur la tablebankaccounts. - Le trigger est configuré pour exécuter la fonction
before_insert_userlogs()pour chaque ligne affectée.
- Un trigger nommé
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 !
Merci pour vos commentaires !