Czy można zmodyfikować istniejącą definicję wyzwalacza w MySQL?

14

Zastanawiam się, czy można zaktualizować definicję wyzwalacza w MySQL. Na przykład mam wyzwalacz T i chcę dodać do niego nowe funkcje.

Zakładam, że muszę to upuścić i odtworzyć.

Jakie są najlepsze praktyki w administrowaniu bazą danych dla takich scenariuszy?

Alex
źródło
Alex, czy szukałeś w dokumentacji MySQL definicji wyzwalacza? Co powiedziałeś; jakiej części nie jesteś pewien lub sprawiasz problemy przy próbie ich wdrożenia?
Michael Green,
Nie znalazłem żadnych informacji w dokumentacji MySQL, czy można zaktualizować wyzwalacz, czy nie. Zakładam, że jest to niemożliwe i chcę dokładnie sprawdzić.
Alex

Odpowiedzi:

19

Wygląda na to, że pytasz, czy można zmienić wyzwalacz w operacji atomowej, w przypadku gdy nowa definicja zawiedzie, nie stracisz starej ... podobnej do CREATE OR REPLACE VIEW, która zastępuje definicję widoku, jeśli nowa definicja jest ważny, ale pozostawia stary na swoim miejscu, jeśli nie możesz go wymienić.

Niestety nie ma ALTER TRIGGERlub CREATE OR REPLACE TRIGGERw MySQL.

Sugerowałbym, że najlepszą praktyką jest zablokowanie tabeli, w której żyje spust, aby nie wpływać na rzędy przy nieobecności spustu. Dozwolone jest upuszczanie i dodawanie wyzwalaczy, gdy tabela jest zablokowana.

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;

Aktualizacja: MariaDB w wersji 10.1.4 dodała obsługę CREATE OR REPLACE TRIGGERzastępowania MySQL.

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

Oracle MySQL od 5.7 nadal opiera się na powyższym rozwiązaniu.

Michael - sqlbot
źródło
2
„MySQL Oracle od 5.7 wciąż opiera się na powyższym rozwiązaniu” - nadal tak jest w wersji 8.0
Paul Campbell