日向夏特殊応援部隊

俺様向けメモ

information_schema から trigger の定義を取得する

PROCEDURE/FUNCTION の場合は何も気にせず SHOW CREATE PROCEDURE とかで取得出来るんですが、TRIGGER の場合はそれ相当のステートメントが存在しません。

発火するタイミング (BEFORE/AFTER) と発火するイベント (INSERT/UPDATE/DELETE) とかあるからシンプルな構文にはならなさそうですが。

で、やっぱり information_schema があればどうにかなりますね。

SELECT CONCAT('CREATE DEFINER=`', SUBSTRING_INDEX(DEFINER, '@', 1), '`@`', SUBSTRING_INDEX(DEFINER, '@', -1), '` TRIGGER ', TRIGGER_NAME, ' ', ACTION_TIMING, ' ', EVENT_MANIPULATION, ' ON ', EVENT_OBJECT_TABLE, '\nFOR EACH ROW ', ACTION_STATEMENT) AS Create_Trigger FROM TRIGGERS WHERE TRIGGER_SCHEMA = 'test' AND EVENT_OBJECT_TABLE = 'hidek' \G

とかやると、

*************************** 1. row ***************************
Create_Trigger: CREATE DEFINER=`zigorou`@`%` TRIGGER hidek_on_after_insert AFTER INSERT ON hidek
BEGIN
  CALL create_hidek_gallary( NEW.id );
  CALL update_hidek_money( NEW.amount, 0, NEW.status );
END
*************************** 2. row ***************************
Create_Trigger: CREATE DEFINER=`root`@`%` TRIGGER hidek_on_after_update AFTER UPDATE ON hidek
BEGIN
  CALL update_hidek_gallary( NEW.id );
  CALL update_hidek_money( NEW.amount, OLD.amount, NEW.status );
END
2 rows in set (0.00 sec)

こんな感じで出て来ます。

当たり前ですが、mysqldump でも --triggers オプションを使えば定義を取得出来ますが、DBI 経由でその定義を設定したい場合は内容を整形しないと怒られてしまうので、こんな感じのやり方で定義を一個ずつ取り出せた方が良いかなーとか思った次第でした。