Home » ラボ&備忘録 » データベース » トリガーのサンプル(SQLite) このエントリーを含むはてなブックマーク

トリガーのサンプル(SQLite)

2006.08.25 Fri/PM

うちの素材閲覧スクリプトより。

このスクリプトで使用するテーブルは以下の4つです。
グループ=大カテゴリ、エントリ=中カテゴリ、エントリタイプ=小カテゴリ、と考えてください。
説明上不要なカラムは省略しています。

pict_group

gidgp_dirgp_sortkeygp_name
1button2ボタン
2background1背景画像
3icon3アイコン

pict_entry

eidgidentry_direntry_nameentry_entrydate
11004ドット#012000-09-13 00:00:00
21008バーコード#012000-09-13 00:00:00
32008花#012000-10-20 00:00:00
43001矢印2000-09-13 00:00:00

pict_entry_type

tideidtype_dirtype_nametype_widthtype_height
11aあお6131
21bあお6131
32aみどり5555
42bあお5555

pict_log

log_notidlog_date
122007-03-12 01:00:59

グループの削除時のトリガー

CREATE TRIGGER remove_group
AFTER
  DELETE ON pict_group
BEGIN
  DELETE FROM pict_entry WHERE pict_entry.gid = old.gid;
END;

グループが削除された時、そのグループに属するエントリを削除するトリガー。

SQLiteは「FOR EACH ROW」しかサポートされていませんので、書かなくても複数の行が実行された場合(グループの一括削除等)では自動的に「FOR EACH ROW」として行分実行されます。

同じように、エントリが削除されたらエントリタイプが削除されるトリガー、エントリタイプが削除されたらログが削除されるトリガーを作っておけば、グループを1つ削除するとそれに後方リンクしているデータも勝手に削除されるようになります。(※ログを削除したらグループが削除されるわけではありません)

エントリ追加時のチェックトリガー

CREATE TRIGGER if_entry_validate
BEFORE
  INSERT ON pict_entry
BEGIN
  SELECT CASE
    -- グループの整合性をチェック
    WHEN ((SELECT gid FROM pict_group WHERE pict_group.gid = new.gid) IS NULL)
    THEN RAISE(ABORT, 'group is undefined')
    -- エントリの重複をチェック
    WHEN ((SELECT entry_dir FROM pict_entry WHERE pict_entry.gid = new.gid AND pict_entry.entry_dir = new.entry_dir) IS NOT NULL)
    THEN RAISE(ABORT, 'entry exists')
  END;
END;

エントリを追加した際に、

をチェックするトリガー。
マッチするとクエリエラーになります。

ABORTよりもFAILの方がいいのかな?