Ist es möglich, eine vorhandene Triggerdefinition in MySQL zu ändern?

14

Ich frage mich, ob es möglich ist, eine Trigger-Definition in MySQL zu aktualisieren. Zum Beispiel habe ich einen Trigger T und möchte ihm einige neue Funktionen hinzufügen.

Ich gehe davon aus, dass ich es löschen und neu erstellen muss.

Was sind die Best Practices in der Datenbankverwaltung für solche Szenarien?

Alex
quelle
Alex, hast du in der MySQL-Dokumentation nach der Trigger-Definition gesucht? Was hat es gesagt; Bei welchen Teilen sind Sie sich unsicher oder verursachen Sie Probleme, wenn Sie versuchen, sie zu implementieren?
Michael Green
Ich habe in der MySQL-Dokumentation keine Informationen gefunden, ob ein Trigger aktualisiert werden kann oder nicht. Ich gehe davon aus, dass es unmöglich ist, und ich möchte noch einmal überprüfen.
Alex

Antworten:

19

Es hört sich so an, als würden Sie gefragt, ob es möglich ist, einen Auslöser in einer atomaren Operation zu ändern. Wenn die neue Definition fehlschlägt, verlieren Sie nicht die alte ... ähnlich der CREATE OR REPLACE VIEW, die die Ansichtsdefinition bei einer neuen Definition ersetzt ist gültig, lässt aber den alten bestehen, wenn Sie ihn nicht ersetzen können.

Leider gibt es keine ALTER TRIGGERoder CREATE OR REPLACE TRIGGERin MySQL.

Ich würde vorschlagen, dass die beste Vorgehensweise darin besteht, die Tabelle zu sperren, in der sich der Trigger befindet, damit keine Zeilen betroffen sind, wenn der Trigger nicht vorhanden ist. Das Löschen und Hinzufügen von Triggern, während eine Tabelle gesperrt ist, ist zulässig.

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;

Update: MariaDB hat in Version 10.1.4 die Unterstützung CREATE OR REPLACE TRIGGERfür den Drop-In-Ersatz für MySQL hinzugefügt .

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

Oracle MySQL ab 5.7 setzt weiterhin auf die oben genannte Lösung.

Michael - sqlbot
quelle
2
"Oracle's MySQL ab 5.7 basiert immer noch auf der obigen Lösung" - immer noch der Fall in Version 8.0
Paul Campbell