101 votes

Déclencheur MySQL Fire pour les opérations d'Insertion et de Mise à jour

Est-il possible de déclencher un déclencheur MySql à la fois pour les événements d'insertion et de mise à jour d'une table ?

Je sais que je peux faire ce qui suit

CREATE TRIGGER my_trigger
    AFTER INSERT ON `table`
    FOR EACH ROW
BEGIN
.....
END //

CREATE TRIGGER my_trigger
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
.....
END //

Mais comment puis-je faire

CREATE TRIGGER my_trigger
    AFTER INSERT ON `table` ET
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
.....

Est-ce possible, ou dois-je utiliser 2 déclencheurs ? Le code est le même pour les deux et je ne veux pas le répéter.

118voto

derobert Points 26258

Vous devez créer deux déclencheurs, mais vous pouvez déplacer le code commun dans une procédure et les faire appeler tous les deux la procédure.

44voto

Al Zziwa Points 1

En réponse à la demande de @Zxaos, étant donné que nous ne pouvons pas avoir d'opérateurs AND/OR pour les déclencheurs MySQL, en commençant par votre code, voici un exemple complet pour y parvenir.

1. Définir le déclencheur INSERT :

DELIMITER //
DROP TRIGGER IF EXISTS my_insert_trigger//
CREATE DEFINER=root@localhost TRIGGER my_insert_trigger
    AFTER INSERT ON `table`
    FOR EACH ROW

BEGIN
    -- Appeler la procédure commune exécutée en cas d'INSERT ou de mise à jour sur `table`
    -- NEW.id est un paramètre d'exemple passé à la procédure mais n'est pas nécessaire
    -- si vous n'avez pas besoin de transmettre quoi que ce soit à votre procédure.
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;

2. Définir le déclencheur UPDATE

DELIMITER //
DROP TRIGGER IF EXISTS my_update_trigger//

CREATE DEFINER=root@localhost TRIGGER my_update_trigger
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
    -- Appeler la procédure commune exécutée en cas d'INSERT ou de mise à jour sur `table`
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;

3. Définir la PROCÉDURE commune utilisée par ces deux déclencheurs :

DELIMITER //
DROP PROCEDURE IF EXISTS procedure_to_run_processes_due_to_changes_on_table//

CREATE DEFINER=root@localhost PROCEDURE procedure_to_run_processes_due_to_changes_on_table(IN table_row_id VARCHAR(255))
READS SQL DATA
BEGIN

    -- Écrivez votre code MySQL à exécuter lorsqu'une ligne `table` est insérée ou mise à jour ici

END//
DELIMITER ;

Vous remarquez que je veille à restaurer le délimiteur une fois que j'ai terminé de définir les déclencheurs et la procédure.

12voto

Jeff_Alieffson Points 132

Malheureusement, nous ne pouvons pas utiliser dans MySQL après INSERT ou UPDATE la description, comme dans Oracle

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X