1つのテーブルには最大6つのトリガーを作成する事が出来ます。
内訳は、INSERT,UPDATE,DELETEにBEFORE,AFTERの2つずつ作成する事が出来ます。
BEFORE INSERT ON table_name
AFTER INSERT ON table_name
BEFORE UPDATE ON table_name
AFTER UPDATE ON table_name
BEFORE DELETE ON table_name
AFTER DELETE ON table_name
BEFORE UPDATEトリガー
DELIMITER //
CREATE TRIGGER dbcomp_before_update_log
BEFORE UPDATE ON dbcomp FOR EACH ROW
BEGIN
INSERT INTO dbcomp_update_log( new_name, old_name )
VALUES ( NEW.name, OLD.name );
-- NEW.nameは更新後、OLD.nameは更新前の値を表す
END//
DELIMITER ;
mysql> update dbcomp set name = '5.1.40-log';
を実行すると以下のトリガーが実行されて値が自動更新される。
INSERT INTO dbcomp_update_log( new_name, old_name )
VALUES ( NEW.name, OLD.name );
-- NEW.nameは更新後、OLD.nameは更新前の値を表す
mysql> update dbcomp set name = '5.4.0';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from dbcomp;
+——-+
| name |
+——-+
| 5.4.0 |
+——-+
1 row in set (0.00 sec)
mysql> select * from dbcomp_update_log;
+————+————+
| old_name | new_name |
+————+————+
| MySQL | 5.1.40-log |
| 5.1.40-log | 5.4.0 |
+————+————+
2 rows in set (0.00 sec)
mysql>
INSERTによって起動されたトリガではNEWのみが有効で、それがDELETEであればOLDのみが有効になる。
たとえば前の例でデータ追加・削除時の状況も記録できるようにするには、以下のトリガを追加する。
DELIMITER //
-- データ追加時に起動されるトリガ
CREATE TRIGGER dbcomp_before_insert_log BEFORE INSERT ON dbcomp FOR EACH ROW
BEGIN
INSERT INTO dbcomp_update_log( new_name )
VALUES ( NEW.name );
END//
BEFORE INSERT
-- データ削除時に起動されるトリガ
CREATE TRIGGER dbcomp_before_delete_log BEFORE DELETE ON dbcomp FOR EACH ROW
BEGIN
INSERT INTO dbcomp_update_log( old_name )
VALUES ( OLD.name );
END//
BEFORE DELETE
————————————————————————————————–
トリガの処理においては、その起動の対象となったテーブルに対して
INSERT / UPDATE / DELETEを実行することはできないのだが、唯一の例外がある。
それは、BEFORE INSERTもしくはBEFORE UPDATEのトリガにおいて、
NEW.nameのような、これから追加・更新しようとする値だけはトリガ内で変更できる
————————————————————————————————–
トリガを削除するには、以下のようなDROP TRIGGER構文を実行する。
スキーマ名称およびトリガ名称はCREATE TRIGGERで設定済みのものでなければならない。
ただしIF EXISTSを付けた場合は、存在しないトリガを指定してもエラーではなくwarningとなる。
DROP TRIGGER [IF EXISTS] [スキーマ名称.]トリガ名称;
トリガーの確認
show triggers from データベース\G
show create trigger dbcomp_before_delete_log
SELECT * FROM information_schema.triggers
where action_timing = 'BEFORE' AND event_manipulation = 'DELETE' \G