SET sexe = 'A'
WHERE id = 20; -- l'animal 20 est Balou, un mâle
SELECT id, sexe, date_naissance, nom
FROM Animal
WHERE id = 20;
id sexe
date_naissance
nom
20 NULL 2007-04-24 12:45:00 Balou
Le sexe est bien NULL, le trigger a fonctionné.
Pour le second trigger, déclenché par l'insertion de lignes, on va implémenter le second comportement : on va déclencher une
erreur, ce qui empêchera l'insertion, et affichera l'erreur.
Mais comment déclencher une erreur ?
Contrairement à certains SGBD, MySQL ne dispose pas d'une commande permettant de déclencher une erreur personnalisée. La
seule solution est donc de faire une requête dont on sait qu'elle va générer une erreur.
Exemple :
Code : SQL
SELECT 1, 2 INTO @a;
Code : Console
ERROR 1222 (21000): The used SELECT statements have a different number of columns
Cependant, il serait quand même intéressant d'avoir un message d'erreur qui soit un peu explicite. Voici une manière d'obtenir un
tel message : on crée une table Erreur, ayant deux colonnes, id et erreur. La colonne id est clé primaire, et erreur contient un
texte court décrivant l'erreur. Un index UNIQUE est ajouté sur cette dernière colonne. On insère ensuite une ligne correspondant
à l'erreur qu'on veut utiliser dans le trigger.
Ensuite dans le corps du trigger, en cas de valeur erronée, on refait la même insertion. Cela déclenche une erreur de contrainte
d'unicité, laquelle affiche le texte qu'on a essayé d'insérer dans Erreur.
Code : SQL
-- Création de la table Erreur
CREATE TABLE Erreur (
id TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
erreur VARCHAR(255) UNIQUE);
-- Insertion de l'erreur qui nous intéresse
INSERT INTO Erreur (erreur) VALUES ('Erreur : sexe doit valoir "M",
"F" ou NULL.');
-- Création du trigger
DELIMITER |
CREATE TRIGGER before_insert_animal BEFORE INSERT
ON Animal FOR EACH ROW
BEGIN
IF NEW.sexe IS NOT NULL
-- le sexe n'est ni NULL
AND NEW.sexe != 'M'
-- ni "M"
AND NEW.sexe != 'F'
-- ni "F"
Partie 5 : Sécuriser et automatiser ses actions
315/414
www.openclassrooms.com
WHERE id = 20; -- l'animal 20 est Balou, un mâle
SELECT id, sexe, date_naissance, nom
FROM Animal
WHERE id = 20;
id sexe
date_naissance
nom
20 NULL 2007-04-24 12:45:00 Balou
Le sexe est bien NULL, le trigger a fonctionné.
Pour le second trigger, déclenché par l'insertion de lignes, on va implémenter le second comportement : on va déclencher une
erreur, ce qui empêchera l'insertion, et affichera l'erreur.
Mais comment déclencher une erreur ?
Contrairement à certains SGBD, MySQL ne dispose pas d'une commande permettant de déclencher une erreur personnalisée. La
seule solution est donc de faire une requête dont on sait qu'elle va générer une erreur.
Exemple :
Code : SQL
SELECT 1, 2 INTO @a;
Code : Console
ERROR 1222 (21000): The used SELECT statements have a different number of columns
Cependant, il serait quand même intéressant d'avoir un message d'erreur qui soit un peu explicite. Voici une manière d'obtenir un
tel message : on crée une table Erreur, ayant deux colonnes, id et erreur. La colonne id est clé primaire, et erreur contient un
texte court décrivant l'erreur. Un index UNIQUE est ajouté sur cette dernière colonne. On insère ensuite une ligne correspondant
à l'erreur qu'on veut utiliser dans le trigger.
Ensuite dans le corps du trigger, en cas de valeur erronée, on refait la même insertion. Cela déclenche une erreur de contrainte
d'unicité, laquelle affiche le texte qu'on a essayé d'insérer dans Erreur.
Code : SQL
-- Création de la table Erreur
CREATE TABLE Erreur (
id TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
erreur VARCHAR(255) UNIQUE);
-- Insertion de l'erreur qui nous intéresse
INSERT INTO Erreur (erreur) VALUES ('Erreur : sexe doit valoir "M",
"F" ou NULL.');
-- Création du trigger
DELIMITER |
CREATE TRIGGER before_insert_animal BEFORE INSERT
ON Animal FOR EACH ROW
BEGIN
IF NEW.sexe IS NOT NULL
-- le sexe n'est ni NULL
AND NEW.sexe != 'M'
-- ni "M"
AND NEW.sexe != 'F'
-- ni "F"
Partie 5 : Sécuriser et automatiser ses actions
315/414
www.openclassrooms.com
