web-dev-qa-db-ja.com

MySQLの既存のトリガー定義を変更することはできますか?

MySQLでトリガー定義を更新できるかどうか疑問に思っています。たとえば、トリガーTがあり、それに新しい機能を追加したいとします。

私の想定では、それをドロップして再作成する必要があります。

このようなシナリオでのデータベース管理のベストプラクティスは何ですか?

15
Alex

アトミック操作でトリガーを変更できるかどうかを尋ねているようですが、新しい定義が失敗しても古い定義は失われません...ビューを置き換えるCREATE OR REPLACE VIEWと同様です新しい定義が有効な場合は定義、それを置き換えることができない場合は古い定義をそのまま残します。

残念ながら、MySQLにはALTER TRIGGERまたはCREATE OR REPLACE TRIGGERはありません。

トリガーが存在する場所でテーブルをロックすることをお勧めします。これにより、トリガーがない場合に行が影響を受けることはありません。テーブルがロックされている間にトリガーを削除および追加できます。

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;

更新:バージョン10.1.4のMariaDBは、MySQLのドロップイン置換にサポートCREATE OR REPLACE TRIGGERを追加しました。

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

5.7以降のOracleのMySQLは、依然として上記のソリューションに依存しています。

20