DELIMITER ;
On aurait pu faire un second IF au lieu d'un ELSEIF, mais de toute façon, le trigger ne pourra déclencher qu'une erreur à la fois.
Test :
Code : SQL
INSERT INTO Adoption (animal_id, client_id, date_reservation,
date_adoption, prix, paye)
VALUES (10, 10, NOW(), NOW() - INTERVAL 2 DAY, 200.00, 0);
INSERT INTO Adoption (animal_id, client_id, date_reservation,
date_adoption, prix, paye)
VALUES (10, 10, NOW(), NOW(), 200.00, 4);
Code : Console
ERROR 1062 (23000): Duplicate entry 'Erreur : date_adoption doit être >= à date_reservati
ERROR 1062 (23000): Duplicate entry 'Erreur : paye doit valoir TRUE (1) ou FALSE (0).' fo
Les deux vérifications fonctionnent !
Mise à jour d'informations dépendant d'autres données
Pour l'instant, lorsque l'on a besoin de savoir quels animaux restent disponibles pour l'adoption, il faut faire une requête avec
sous-requête.
Code : SQL
SELECT id, nom, sexe, date_naissance, commentaires
FROM Animal
WHERE NOT EXISTS (
SELECT *
FROM Adoption
WHERE Animal.id = Adoption.animal_id
);
Mais une telle requête n'est pas particulièrement performante, et elle est relativement peu facile à lire. Les triggers peuvent nous
permettre de stocker automatiquement une donnée permettant de savoir immédiatement si un animal est disponible ou non.
Pour cela, il suffit d'ajouter une colonne disponible à la table Animal, qui vaudra FALSE ou TRUE, et qui sera mise à jour grâce à
trois triggers sur la table Adoption.
À l'insertion d'une nouvelle adoption, il faut retirer l'animal adopté des animaux disponibles ;
en cas de suppression, il faut faire le contraire ;
en cas de modification d'une adoption, si l'animal adopté change, il faut remettre l'ancien parmi les animaux disponibles et
retirer le nouveau.
Code : SQL
-- Ajout de la colonne disponible
ALTER TABLE Animal ADD COLUMN disponible BOOLEAN DEFAULT TRUE; -- À
l'insertion, un animal est forcément disponible
Partie 5 : Sécuriser et automatiser ses actions
318/414
www.openclassrooms.com
On aurait pu faire un second IF au lieu d'un ELSEIF, mais de toute façon, le trigger ne pourra déclencher qu'une erreur à la fois.
Test :
Code : SQL
INSERT INTO Adoption (animal_id, client_id, date_reservation,
date_adoption, prix, paye)
VALUES (10, 10, NOW(), NOW() - INTERVAL 2 DAY, 200.00, 0);
INSERT INTO Adoption (animal_id, client_id, date_reservation,
date_adoption, prix, paye)
VALUES (10, 10, NOW(), NOW(), 200.00, 4);
Code : Console
ERROR 1062 (23000): Duplicate entry 'Erreur : date_adoption doit être >= à date_reservati
ERROR 1062 (23000): Duplicate entry 'Erreur : paye doit valoir TRUE (1) ou FALSE (0).' fo
Les deux vérifications fonctionnent !
Mise à jour d'informations dépendant d'autres données
Pour l'instant, lorsque l'on a besoin de savoir quels animaux restent disponibles pour l'adoption, il faut faire une requête avec
sous-requête.
Code : SQL
SELECT id, nom, sexe, date_naissance, commentaires
FROM Animal
WHERE NOT EXISTS (
SELECT *
FROM Adoption
WHERE Animal.id = Adoption.animal_id
);
Mais une telle requête n'est pas particulièrement performante, et elle est relativement peu facile à lire. Les triggers peuvent nous
permettre de stocker automatiquement une donnée permettant de savoir immédiatement si un animal est disponible ou non.
Pour cela, il suffit d'ajouter une colonne disponible à la table Animal, qui vaudra FALSE ou TRUE, et qui sera mise à jour grâce à
trois triggers sur la table Adoption.
À l'insertion d'une nouvelle adoption, il faut retirer l'animal adopté des animaux disponibles ;
en cas de suppression, il faut faire le contraire ;
en cas de modification d'une adoption, si l'animal adopté change, il faut remettre l'ancien parmi les animaux disponibles et
retirer le nouveau.
Code : SQL
-- Ajout de la colonne disponible
ALTER TABLE Animal ADD COLUMN disponible BOOLEAN DEFAULT TRUE; -- À
l'insertion, un animal est forcément disponible
Partie 5 : Sécuriser et automatiser ses actions
318/414
www.openclassrooms.com
