Déclencheurs
Déclencheurs dans les bases de données sont des types spéciaux de procédures stockées qui sont automatiquement exécutées 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 et des modifications des objets de schéma de base de données comme les tables ou les vues.
Remarque
Les déclencheurs ne peuvent pas être invoqués explicitement par les utilisateurs. Au lieu de cela, ils sont automatiquement exécutés en réponse aux opérations auxquelles ils sont associés.
Déclencheurs DML
Un déclencheur DML, également connu sous le nom de déclencheur de 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 après : Ces déclencheurs se déclenchent après l'exécution de l'action de déclenchement (insertion, mise à jour, suppression) sur la table ;
- Déclencheurs avant : Ces déclencheurs se déclenchent avant l'action de déclenchement. Ils vous permettent d'intercepter l'action originale et d'exécuter une logique personnalisée avant de décider de poursuivre ou non l'action originale.
Exemple de déclencheur après
Nous avons précédemment exploré un exemple d'utilisation d'une transaction pour ajouter des valeurs à la table BankAccounts
et à la table UserLogs
en tant qu'unité logique unique dans la première section de ce cours.
Maintenant, au lieu d'utiliser une transaction, nous pouvons réaliser cela en créant un déclencheur AFTER
sur l'opération INSERT
dans la table BankAccounts
.
En conséquence, nous ne pourrons insérer que de nouveaux comptes, et la valeur de journal correspondante sera automatiquement ajoutée par le déclencheur.
sql-- Create an after-insert trigger for UserLogsCREATE FUNCTION after_insert_trigger_function()RETURNS TRIGGER AS $$BEGIN-- Perform some action, like logging the insertINSERT 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 tableCREATE TRIGGER after_insert_triggerAFTER INSERT ON BankAccountsFOR EACH ROWEXECUTE PROCEDURE after_insert_trigger_function();
Remarque
Dans les déclencheurs PostgreSQL,
NEW
est une variable d'enregistrement spéciale représentant la nouvelle ligne insérée ou mise à jour dans la table. Elle vous permet d'accéder aux valeurs des colonnes dans la nouvelle ligne au sein de la fonction de déclenchement.
Si nous travaillons avec des lignes supprimées, nous devons utiliser la variable d'enregistrementOLD
au lieu deNEW
.
Exemple de déclencheur avant
Supposons que nous voulons empêcher l'ajout de valeurs avec un solde de compte négatif. Nous pouvons créer un déclencheur BEFORE
pour y parvenir. Ce déclencheur vérifiera le solde avant l'opération, et s'il est négatif, l'opération ne sera pas effectuée.
sql-- Create the trigger functionCREATE FUNCTION before_insert_trigger_function() RETURNS TRIGGER AS $$BEGIN-- Check if the account balance is less than 0IF (NEW.balance < 0) THEN-- If balance is less than 0, do nothing and returnRAISE NOTICE 'Balance is less than 0. Action not logged.';ELSE-- If balance is greater than or equal to 0, log the actionRAISE NOTICE 'Logging insert into UserLogs';-- Inserting into the UserLogs tableINSERT 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 successfullyRETURN NULL;END;$$ LANGUAGE plpgsql;-- Create the triggerCREATE TRIGGER before_insert_triggerBEFORE INSERT ON BankAccountsFOR EACH ROWEXECUTE PROCEDURE before_insert_trigger_function();
Modèle de création de déclencheur
Nous pouvons observer le modèle typique pour créer des déclencheurs : initialement, nous définissons une fonction pour exécuter une logique spécifique avant ou après une opération. Ensuite, nous associons cette fonction comme un déclencheur à une table et une action désignées.
Veuillez noter que dans l'instruction :
sqlCREATE TRIGGER trigger_nameAFTER INSERT ON table_nameFOR EACH ROWEXECUTE PROCEDURE proc_name;
nous avons la flexibilité d'utiliser UPDATE
ou DELETE
, à la place de l'opération INSERT
.
Mais faites attention que nous ne pouvons pas créer de déclencheurs SELECT
car l'instruction SELECT
ne modifie aucune ligne dans la table !
Merci pour vos commentaires !