Déclencheurs (Triggers) MySQL pour l'automatisation

MySQLMySQLBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire (lab), vous apprendrez à automatiser des tâches dans MySQL en utilisant des déclencheurs (triggers). Le laboratoire se concentre sur la création d'un déclencheur qui enregistre les opérations d'insertion sur une table products dans une table distincte product_logs.

Le laboratoire vous guide tout au long de la connexion au serveur MySQL, de la création de la base de données mydatabase et de la définition des tables products et product_logs. Vous créerez ensuite un déclencheur nommé products_after_insert qui insère automatiquement un enregistrement dans la table product_logs chaque fois qu'un nouveau produit est ajouté à la table products. Les étapes suivantes consistent à tester le déclencheur, à mettre à jour sa logique et, enfin, à supprimer le déclencheur.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mysql(("MySQL")) -.-> mysql/BasicKeywordsandStatementsGroup(["Basic Keywords and Statements"]) mysql/BasicKeywordsandStatementsGroup -.-> mysql/create_database("Database Creation") mysql/BasicKeywordsandStatementsGroup -.-> mysql/create_table("Table Creation") mysql/BasicKeywordsandStatementsGroup -.-> mysql/drop_table("Table Removal") mysql/BasicKeywordsandStatementsGroup -.-> mysql/alter_table("Table Modification") mysql/BasicKeywordsandStatementsGroup -.-> mysql/select("Data Retrieval") mysql/BasicKeywordsandStatementsGroup -.-> mysql/insert("Data Insertion") mysql/BasicKeywordsandStatementsGroup -.-> mysql/delete("Data Deletion") subgraph Lab Skills mysql/create_database -.-> lab-550919{{"Déclencheurs (Triggers) MySQL pour l'automatisation"}} mysql/create_table -.-> lab-550919{{"Déclencheurs (Triggers) MySQL pour l'automatisation"}} mysql/drop_table -.-> lab-550919{{"Déclencheurs (Triggers) MySQL pour l'automatisation"}} mysql/alter_table -.-> lab-550919{{"Déclencheurs (Triggers) MySQL pour l'automatisation"}} mysql/select -.-> lab-550919{{"Déclencheurs (Triggers) MySQL pour l'automatisation"}} mysql/insert -.-> lab-550919{{"Déclencheurs (Triggers) MySQL pour l'automatisation"}} mysql/delete -.-> lab-550919{{"Déclencheurs (Triggers) MySQL pour l'automatisation"}} end

Créer un déclencheur (trigger) pour enregistrer les insertions

Dans cette étape, vous apprendrez à créer un déclencheur dans MySQL qui enregistre les opérations d'insertion dans une table distincte. Les déclencheurs (triggers) sont des programmes stockés spéciaux qui s'exécutent automatiquement en réponse à certains événements sur une table, tels que INSERT, UPDATE ou DELETE. Cela est utile pour auditer les modifications, appliquer des règles métier ou effectuer d'autres actions basées sur les modifications de données.

Tout d'abord, connectons-nous au serveur MySQL. Ouvrez un terminal et exécutez la commande suivante :

mysql -u root -p

Vous serez invité à saisir le mot de passe de l'utilisateur root. Entrez le mot de passe et appuyez sur Entrée.

Ensuite, créez une base de données nommée mydatabase si elle n'existe pas déjà :

CREATE DATABASE IF NOT EXISTS mydatabase;
USE mydatabase;

Maintenant, créons une table nommée products :

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    price DECIMAL(10, 2) NOT NULL
);

Nous avons également besoin d'une table pour enregistrer les opérations d'insertion. Créons une table nommée product_logs :

CREATE TABLE product_logs (
    log_id INT AUTO_INCREMENT PRIMARY KEY,
    product_id INT,
    product_name VARCHAR(255),
    product_price DECIMAL(10, 2),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Maintenant, créons le déclencheur. Le déclencheur sera exécuté après chaque opération d'insertion sur la table products. Le déclencheur insérera un enregistrement dans la table product_logs avec les détails du produit inséré.

CREATE TRIGGER products_after_insert
AFTER INSERT ON products
FOR EACH ROW
BEGIN
    INSERT INTO product_logs (product_id, product_name, product_price)
    VALUES (NEW.id, NEW.name, NEW.price);
END;

Décortiquons la définition du déclencheur :

  • CREATE TRIGGER products_after_insert : Cette instruction crée un déclencheur nommé products_after_insert.
  • AFTER INSERT ON products : Cela spécifie que le déclencheur sera exécuté après chaque opération d'insertion sur la table products.
  • FOR EACH ROW : Cela indique que le déclencheur sera exécuté pour chaque ligne qui est insérée dans la table products.
  • BEGIN ... END : Ce bloc contient les instructions SQL qui seront exécutées lorsque le déclencheur est activé.
  • NEW.id, NEW.name, NEW.price : Ces termes font référence aux valeurs des colonnes id, name et price de la ligne nouvellement insérée.

Maintenant, insérons des données dans la table products pour tester le déclencheur :

INSERT INTO products (name, price) VALUES ('Laptop', 1200.00);
INSERT INTO products (name, price) VALUES ('Mouse', 25.00);

Enfin, vérifions la table product_logs pour voir si le déclencheur a inséré les enregistrements de journalisation :

SELECT * FROM product_logs;

Vous devriez voir deux enregistrements dans la table product_logs, correspondant aux deux opérations d'insertion que nous avons effectuées sur la table products.

+--------+------------+--------------+---------------+---------------------+
| log_id | product_id | product_name | product_price | created_at          |
+--------+------------+--------------+---------------+---------------------+
|      1 |          1 | Laptop       |       1200.00 | 2024-10-27 12:00:00 |
|      2 |          2 | Mouse        |         25.00 | 2024-10-27 12:00:00 |
+--------+------------+--------------+---------------+---------------------+
2 rows in set (0.00 sec)

Insérer des données pour tester le déclencheur (trigger)

Dans cette étape, vous allez insérer des données dans la table products, ce qui déclenchera le déclencheur products_after_insert que vous avez créé à l'étape précédente. Cela vous permettra de vérifier que le déclencheur fonctionne correctement et qu'il insère les données attendues dans la table product_logs.

Tout d'abord, assurez-vous d'être connecté au serveur MySQL et d'utiliser la base de données mydatabase. Si vous n'êtes pas déjà connecté, ouvrez un terminal et exécutez les commandes suivantes :

mysql -u root -p

Entrez le mot de passe lorsque vous y êtes invité.

USE mydatabase;

Maintenant, insérons quelques données dans la table products. Nous allons insérer trois nouveaux produits avec différents noms et prix :

INSERT INTO products (name, price) VALUES ('Keyboard', 75.00);
INSERT INTO products (name, price) VALUES ('Monitor', 300.00);
INSERT INTO products (name, price) VALUES ('Headphones', 100.00);

Ces instructions INSERT ajouteront trois nouvelles lignes à la table products. En raison du déclencheur que nous avons créé, chacune de ces insertions devrait également entraîner l'ajout d'une nouvelle ligne dans la table product_logs.

Pour vérifier que le déclencheur fonctionne correctement, interrogeons la table product_logs et vérifions si les nouveaux enregistrements ont été insérés :

SELECT * FROM product_logs;

Vous devriez voir les enregistrements correspondant aux produits nouvellement insérés dans la table product_logs. La sortie devrait ressembler à ceci (les valeurs de log_id et created_at seront différentes) :

+--------+------------+--------------+---------------+---------------------+
| log_id | product_id | product_name | product_price | created_at          |
+--------+------------+--------------+---------------+---------------------+
|      1 |          1 | Laptop       |       1200.00 | 2024-10-27 12:00:00 |
|      2 |          2 | Mouse        |         25.00 | 2024-10-27 12:00:00 |
|      3 |          3 | Keyboard     |         75.00 | 2024-10-27 12:05:00 |
|      4 |          4 | Monitor      |        300.00 | 2024-10-27 12:05:00 |
|      5 |          5 | Headphones   |        100.00 | 2024-10-27 12:05:00 |
+--------+------------+--------------+---------------+---------------------+
5 rows in set (0.00 sec)

Si vous voyez les nouveaux enregistrements dans la table product_logs, cela signifie que le déclencheur fonctionne correctement. Le product_id devrait correspondre à l'id du produit correspondant dans la table products, et le product_name et le product_price devraient également correspondre aux valeurs que vous avez insérées.

Mettre à jour la logique du déclencheur (trigger)

Dans cette étape, vous allez modifier le déclencheur existant products_after_insert pour inclure des informations supplémentaires dans la table product_logs. Plus précisément, vous allez ajouter l'horodatage actuel dans une nouvelle colonne nommée operation_time de la table product_logs.

Tout d'abord, vous devez ajouter la colonne operation_time à la table product_logs. Connectez-vous au serveur MySQL et utilisez la base de données mydatabase :

mysql -u root -p

Entrez le mot de passe lorsque vous y êtes invité.

USE mydatabase;

Maintenant, ajoutez la colonne operation_time à la table product_logs :

ALTER TABLE product_logs ADD COLUMN operation_time TIMESTAMP;

Ensuite, vous devez supprimer le déclencheur existant products_after_insert avant de le recréer avec la logique mise à jour :

DROP TRIGGER IF EXISTS products_after_insert;

Maintenant, recréez le déclencheur avec la logique mise à jour pour inclure operation_time. Nous allons définir operation_time sur l'horodatage actuel lorsque le déclencheur est exécuté :

CREATE TRIGGER products_after_insert
AFTER INSERT ON products
FOR EACH ROW
BEGIN
    INSERT INTO product_logs (product_id, product_name, product_price, operation_time)
    VALUES (NEW.id, NEW.name, NEW.price, CURRENT_TIMESTAMP);
END;

Dans ce déclencheur mis à jour :

  • Nous avons ajouté operation_time à la liste des colonnes de la table product_logs dans l'instruction INSERT.
  • Nous avons défini la valeur de operation_time sur CURRENT_TIMESTAMP, qui insérera la date et l'heure actuelles lorsque le déclencheur est exécuté.

Maintenant, insérons de nouvelles données dans la table products pour tester le déclencheur mis à jour :

INSERT INTO products (name, price) VALUES ('Printer', 200.00);

Enfin, vérifions la table product_logs pour voir si le déclencheur a inséré l'enregistrement de journal avec operation_time :

SELECT * FROM product_logs;

Vous devriez voir un nouvel enregistrement dans la table product_logs avec la colonne operation_time remplie avec l'horodatage actuel. La sortie devrait ressembler à ceci (les valeurs de log_id, created_at et operation_time seront différentes) :

+--------+------------+--------------+---------------+---------------------+---------------------+
| log_id | product_id | product_name | product_price | created_at          | operation_time      |
+--------+------------+--------------+---------------+---------------------+---------------------+
|      1 |          1 | Laptop       |       1200.00 | 2024-10-27 12:00:00 | NULL                |
|      2 |          2 | Mouse        |         25.00 | 2024-10-27 12:00:00 | NULL                |
|      3 |          3 | Keyboard     |         75.00 | 2024-10-27 12:05:00 | NULL                |
|      4 |          4 | Monitor      |        300.00 | 2024-10-27 12:05:00 | NULL                |
|      5 |          5 | Headphones   |        100.00 | 2024-10-27 12:05:00 | NULL                |
|      6 |          6 | Printer      |        200.00 | 2024-10-27 12:10:00 | 2024-10-27 12:10:00 |
+--------+------------+--------------+---------------+---------------------+---------------------+
6 rows in set (0.00 sec)

Notez que operation_time pour la nouvelle entrée est rempli, tandis que les anciennes entrées sont NULL car elles ont été insérées avant l'ajout de la colonne et la mise à jour du déclencheur.

Supprimer le déclencheur (trigger)

Dans cette étape, vous allez supprimer le déclencheur products_after_insert que vous avez créé et mis à jour dans les étapes précédentes. Supprimer un déclencheur le retire de la base de données, il ne sera donc plus exécuté lorsque l'événement associé se produira.

Tout d'abord, assurez-vous d'être connecté au serveur MySQL et d'utiliser la base de données mydatabase. Si vous n'êtes pas déjà connecté, ouvrez un terminal et exécutez les commandes suivantes :

mysql -u root -p

Entrez le mot de passe lorsque vous y êtes invité.

USE mydatabase;

Pour supprimer le déclencheur, utilisez la commande SQL suivante :

DROP TRIGGER IF EXISTS products_after_insert;

L'instruction DROP TRIGGER supprime le déclencheur spécifié de la base de données. La clause IF EXISTS garantit que la commande ne renverra pas d'erreur si le déclencheur n'existe pas.

Pour vérifier que le déclencheur a été supprimé, vous pouvez utiliser la commande SHOW TRIGGERS :

SHOW TRIGGERS LIKE 'products_after_insert';

Si le déclencheur a été supprimé avec succès, la commande SHOW TRIGGERS ne renverra aucun résultat.

Insérons un autre enregistrement dans la table products pour confirmer que le déclencheur est effectivement supprimé et ne journalise plus les nouvelles insertions :

INSERT INTO products (name, price) VALUES ('Webcam', 50.00);

Maintenant, vérifions la table product_logs. Si le déclencheur a été supprimé avec succès, la nouvelle insertion ne devrait pas être journalisée.

SELECT * FROM product_logs;

Vous ne devriez pas voir un nouvel enregistrement pour 'Webcam' dans la table product_logs. Cela confirme que le déclencheur a été supprimé avec succès.

Résumé

Dans ce laboratoire (lab), vous avez appris à créer un déclencheur (trigger) MySQL qui enregistre automatiquement les opérations d'insertion dans une table distincte. Cela a impliqué de vous connecter au serveur MySQL, de créer une base de données et deux tables : products et product_logs. La table products stocke les informations sur les produits, tandis que product_logs enregistre les détails de chaque produit inséré.

Le cœur de cette étape consistait à définir un déclencheur nommé products_after_insert qui s'exécute après chaque insertion dans la table products. Ce déclencheur insère un nouvel enregistrement dans la table product_logs, capturant l'id, le name et le price du produit nouvellement inséré à l'aide du mot-clé NEW.