Contourner une limitation des triggers sous MySQL
2011
Les triggers et procédures stockées sont des fonctionnalités intéressantes sous MySQL 5, encore faut-il savoir les utiliser et en connaître les limitations.
Par exemple, il est impossible d’effectuer une deuxième action sur la table appelant un trigger, alors qu’ORACLE par exemple l’autorise.
Après avoir cherché en vain – mais pas trop longtemps – une solution sur google, j’ai mis mon (petit) cerveau à contribution…
Au lieu d’effectuer l’ensemble des opérations dans le trigger, pourquoi ne pas appeler une procédure stockée qui elle, déclenchera le trigger, et effectuera ensuite la dernière opération sur la table appelante ?
Ce qui donne dans mon cas (j’ai limité le code du trigger au strict minimum -en fait je mets à jour la table, je passe des codes à d’autres tables, j’archive des données dans une troisième table… bref une petite usine à gaz – pour une opération simple un trigger n’aurait pas été utile) :
-- la procédure
CREATE PROCEDURE my_hack(new_id INT, new_code INT)
BEGIN
UPDATE table_1 SET closed = 0, code = new_code WHERE id = new_id;
DELETE FROM table_1 WHERE id = new_id;
END;
-- le trigger
CREATE TRIGGER my_trigger AFTER UPDATE ON table_1 FOR EACH ROW
BEGIN
INSERT INTO table_2 (id, closed, code, other_field)
VALUES (OLD.id, NEW.closed, NEW.code, OLD.other_field);
END;
-- l'appel depuis le programme appelant
CALL my_hack(1, 9);
Ceci dit, si quelqu’un a plus simple, qu’il me fasse signe, je suis preneur…
