Database JUNKY

MySQL,MariaDBを中心としたブログです

検証!!MySQLトリガを試してみる

MySQLトリガを試してみる

Trigger..DB2の時もそうだったけど、運用が大変なんだよな。。と思いつつ、何かDBをやるたびに、突如トリガを試してみたくなったので検証してみました。 今回の検証では、ソーステーブルに、INSERT,UPDATE,DELETEが走った場合、trigger_tbl_cloneに必要なtrigger_tbl_srcのカラムのみを出力してコンパクトなテーブルを作ってみるなんていう検証です。

1. 下記テーブルを作成する

CREATE TABLE trigger_tbl_clone ( id bigint(19) NOT NULL AUTO_INCREMENT, col2 enum('on','off') NOT NULL DEFAULT 'on', limit enum('member','open') NOT NULL, created datetime NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. データをの流し込みを行う

truncate table trigger_tbl_clone; insert into trigger_tbl_clone select id,col2,limit,created from trigger_tbl_src;

3. トリガを生成する

インサートトリガ

delimiter // CREATE TRIGGER trigger_tbl_clone_ins AFTER INSERT ON trigger_tbl_src FOR EACH ROW BEGIN insert into trigger_tbl_clone values (NEW.id,NEW.col2,NEW.limit,NEW.created); END;// delimiter ;

# UPDATEトリガ delimiter // CREATE TRIGGER trigger_tbl_clone_upd AFTER UPDATE ON trigger_tbl_src FOR EACH ROW BEGIN update trigger_tbl_clone set id = NEW.id, col2 = NEW.col2, limit = NEW.limit, created = NEW.created where id = NEW.id; END;// delimiter ;

# DELETEトリガ delimiter // CREATE TRIGGER trigger_tbl_clone_del AFTER DELETE ON trigger_tbl_src FOR EACH ROW BEGIN delete from trigger_tbl_clone where id = OLD.id; END;// delimiter ;

動作検証

検証を開始しようと思ったらエラーが、、あららららららら

INSERT INTO trigger_tbl_src (name, category, limit, accept, origi_url, info, adm, created) VALUES ('21313313113131331', 0, 'open', 'not_need', '', '132132131213211321131313131', 61, '2011-01-06 20:12:03')"

1558: Column count of mysql.proc is wrong. Expected 20, found 16. Created with MySQL 50077, now running 50153. Please use mysql_upgrade to fix this error."

MySQLのバグらしく以下のコマンドを実行し再度トライ

# mysql_upgrade -p

MySQLのバグらしく、上記コマンドを流せば、この問題は解決されます。

改めて検証を開始 新規コミュニティー作成

  1. trigger_tbl_src反映確認

mysql>  select * from trigger_tbl_src order by id desc limit 1\G; 1. row id: 3488 disp_id: 4715347248 col2: on name: トリガを検証中です。 adm: 53 official: off category: 4 limit: open accept: need ext: no img_key: NULL origi_url: info: この検証はトリガーが正常に稼動するかの検証テーブルです created: 2011-01-06 20:45:41

  1. trigger_tbl_clone 反映確認 trigger_tbl_srcの反映内容を元にtrigger_tbl_cloneが新規で作成されていることを確認

mysql> select * from trigger_tbl_clone order by id desc limit 1\G; 1. row id: 3488 col2: on limit: open created: 2011-01-06 20:45:41 1 row in set (0.00 sec)

★trigger_tbl_src反映確認

mysql> select * from trigger_tbl_src order by id desc limit 1\G; 1. row id: 3488 disp_id: 4715347248 col2: on name: トリガを検証中です。 adm: 53 official: off category: 4 limit: member accept: not_need ext: no img_key: NULL origi_url: info: この検証はトリガーが正常に稼動するかの検証テーブルです created: 2011-01-06 20:45:41 1 row in set (0.00 sec)

1. trigger_tbl_clone 反映確認 trigger_tbl_srcの変更に合わせtrigger_tbl_cloneも変更されていることを確認

mysql> select * from trigger_tbl_clone order by id desc limit 1\G; 1. row id: 3488 col2: on limit: member created: 2011-01-06 20:45:41 1 row in set (0.00 sec)

補足

  1. トリガのDROPは以下のような手順で行う

DROP TRIGGER trigger_tbl_clone_ins; DROP TRIGGER trigger_tbl_clone_upd; DROP TRIGGER trigger_tbl_clone_del;