web-dev-qa-db-fra.com

Déclencheur d'incendie MySQL pour l'insertion et la mise à jour

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.

97
Adam Price

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 par la procédure.

116
derobert

En réponse à la requête @Zxaos, étant donné que nous ne pouvons pas avoir d'opérateurs AND/OR pour les déclencheurs MySQL, à partir de votre code, voici un exemple complet pour obtenir le même résultat.

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
    -- 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é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
    -- 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 ;

. Définissez la PROCEDURE 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 mon entreprise a fini de définir les déclencheurs et la procédure.

43
Al Zziwa

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

12
Jeff_Alieffson