Похоже, вы спрашиваете, возможно ли изменить триггер в атомарной операции, где, если новое определение не удается, вы не потеряете старое ... похоже на CREATE OR REPLACE VIEW
, которое заменяет определение представления, если новое определение действителен, но оставляет старый на месте, если вы не можете заменить его.
К сожалению, нет ALTER TRIGGER
или CREATE OR REPLACE TRIGGER
в MySQL.
Я хотел бы предложить, чтобы лучше всего было блокировать таблицу, в которой находится триггер, чтобы никакие строки не затрагивались при отсутствии триггера. Разрешается удаление и добавление триггеров, когда таблица заблокирована.
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;
Обновление: MariaDB, в версии 10.1.4, добавила поддержку CREATE OR REPLACE TRIGGER
их замены в MySQL.
https://mariadb.com/kb/en/mariadb/create-trigger/
Oracle MySQL с версии 5.7 по-прежнему опирается на решение выше.