web-dev-qa-db-fra.com

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

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?

15
Alex

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'ancienne en place, si vous ne pouvez pas la remplacer.

Malheureusement, il n'y a pas de ALTER TRIGGER ou CREATE OR REPLACE TRIGGER dans MySQL.

Je suggérerais que la meilleure pratique consiste à verrouiller la table où se trouve le déclencheur, afin 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, ajout du support CREATE OR REPLACE TRIGGER à leur remplacement de remplacement pour MySQL.

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

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

20
Michael - sqlbot