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 ;

trigger_review

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は更新前の値を表す

trigger_review_action

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
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
trigger_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-_triggers_from_db

show create trigger dbcomp_before_delete_log
show_create_trigger


SELECT * FROM information_schema.triggers
where action_timing = 'BEFORE' AND event_manipulation = 'DELETE' \G

information_schema_triggers

MYSQL Triggers
[MySQL] MySQLのトリガとイベントスケジューラ

Comments are closed.

Post Navigation