MySQL Fire Trigger pour l'insertion et la mise à jour

111

Est-il possible de déclencher un déclencheur mysql 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` AND
    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.

Adam S-Price
la source

Réponses:

126

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.

derobert
la source
3
Pourriez-vous en donner un petit exemple à ceux d'entre nous qui ne connaissent pas la syntaxe?
Zxaos
3
@Zxaos: Je suggère de commencer par dev.mysql.com/doc/refman/5.1/en/create-procedure.html (qui comprend quelques exemples) et de poser vos propres questions si nécessaire.
derobert
2
C'est dommage qu'on ne puisse pas utiliser les opérateurs AND / OR comme dans Oracle, encore plus quand on ne peut pas non plus passer par paramètre à une procédure l'ensemble des variables OLD et NEW. Mon code sera> 2x
Mikel
Celui-ci est utile pour un développeur qui ne fait jamais de compromis sur l'écriture d'un code deux fois.
Sayka
1
@luismartingil il y a probablement une surcharge supplémentaire pour appeler une procédure par rapport à son insertion. Mais en échange, vous bénéficiez d'une maintenance plus facile et d'une garantie que le code des deux déclencheurs ne divergera pas accidentellement.
derobert
46

En réponse à la demande @Zxaos, puisque nous ne pouvons pas avoir d'opérateurs ET / OU pour les déclencheurs MySQL, en commençant par votre code, voici un exemple complet pour réaliser la même chose.

1. Définissez 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
    -- Call the common procedure ran if there is an INSERT or UPDATE on `table`
    -- NEW.id is an example parameter passed to the procedure but is not required
    -- if you do not need to pass anything to your procedure.
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;

2. Définissez 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
    -- Call the common procedure ran if there is an INSERT or UPDATE on `table`
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;

3. Définissez 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

    -- Write your MySQL code to perform when a `table` row is inserted or updated here

END//
DELIMITER ;

Vous notez que je prends soin de restaurer le délimiteur lorsque j'en ai fini avec mon entreprise en définissant les déclencheurs et la procédure.

Al Zziwa
la source
1
Qu'est- IN table_row_id VARCHAR(255)ce que dans ce cas? Je veux dire, comment définissez-vous quelle ligne va être insérée ou mise à jour?
VaTo
13

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

Jeff_Alieffson
la source