Est-il possible de modifier une définition de déclencheur existante dans MySQL?

14

Je me demande s'il est possible de mettre à jour une définition de déclencheur dans MySQL. Par exemple, j'ai un déclencheur T et je veux lui ajouter de nouvelles fonctionnalités.

Mon hypothèse est que je dois le supprimer et le recréer.

Quelles sont les meilleures pratiques d'administration de la base de données pour de tels scénarios?

Alex
la source
Alex, avez-vous regardé dans la documentation MySQL pour la définition du déclencheur? Qu'est ce que ça dit; de quelle (s) partie (s) vous n'êtes pas sûr (e) ou vous pose des problèmes lorsque vous essayez de les mettre en œuvre?
Michael Green
Je n'ai trouvé aucune information dans la documentation MySQL s'il est possible de mettre à jour un déclencheur ou non. Je suppose que c'est impossible et je veux vérifier.
Alex

Réponses:

19

On dirait que vous demandez s'il est possible de modifier un déclencheur dans une opération atomique, où, si la nouvelle définition échoue, vous ne perdez pas l'ancienne ... similaire à CREATE OR REPLACE VIEW, qui remplace la définition de la vue si la nouvelle définition est valide, mais laisse l'ancien en place, si vous ne pouvez pas le remplacer.

Malheureusement, il n'y en a pas ALTER TRIGGERou CREATE OR REPLACE TRIGGERdans MySQL.

Je suggérerais que la meilleure pratique consiste à verrouiller la table où se trouve le déclencheur, de sorte qu'aucune ligne ne soit affectée avec le déclencheur absent. La suppression et l'ajout de déclencheurs lorsqu'une table est verrouillée est autorisé.

mysql> LOCK TABLES t1 WRITE; -- the next prompt appears once you've obtained the lock
mysql> DROP TRIGGER t1_bi; 
mysql> DELIMITER $$
mysql> CREATE TRIGGER ti_bi BEFORE INSERT ON t1 FOR EACH ROW 
       BEGIN
       ...
       END $$
mysql> DELIMITER ;
mysql> UNLOCK TABLES;

Mise à jour: MariaDB, dans la version 10.1.4, a ajouté la prise CREATE OR REPLACE TRIGGERen charge de leur remplacement direct pour MySQL.

https://mariadb.com/kb/en/mariadb/create-trigger/

MySQL d'Oracle à partir de 5.7 repose toujours sur la solution ci-dessus.

Michael - sqlbot
la source
2
"MySQL d'Oracle à partir de 5.7 repose toujours sur la solution ci-dessus" - toujours le cas dans la version 8.0
Paul Campbell