トリガーの作成

トリガーの作成方法を確認します。基本となる構文は下記の通りです。

CREATE TRIGGER トリガー名 [ BEFORE | AFTER | INSTEAD OF]
 { DELETE | UPDATE [OF カラム名, ...] | INSERT } ON テーブル名
 [ FOR EACH ROW | FOR EACH STATEMENT ]
 [ WHERE 条件式 ]
 BEGIN
  SQL文1;
  SQL文2;
  ...
 END;

少し複雑に見えますが、例えば特定のカラムにUPDATEが行われた時にトリガーを設定する場合は次のように記述できます。

CREATE TRIGGER トリガー名 UPDATE OF カラム名 ON テーブル名
 BEGIN
  SQL文1;
  SQL文2;
  ...
 END;

この場合、指定のテーブルのデータの更新が行われた場合、指定したカラムの値が更新されるとBEGINからENDまでに記載されたSQL文が実行されることになります。

同じようにテーブルに対してDELETE文が実行された時とINSERT文が実行された時にトリガーを設定する場合はそれぞれ次のようになります。

CREATE TRIGGER トリガー名 DELETE ON テーブル名
 BEGIN
  SQL文1;
  SQL文2;
  ...
 END;
CREATE TRIGGER トリガー名 INSERT ON テーブル名
 BEGIN
  SQL文1;
  SQL文2;
  ...
 END;

具体的には次のように記述します。

create trigger sampletrigger insert on goodstable
begin
insert into ...
end;

上記では「goodstable」テーブルにデータが挿入された時、beginからendの間に記述されたinsert文が実行されます。

なお「FOR EACH ROW」を指定すると対象テーブルに含まれるデータに対してUPDATEやDELETEが1行行われるたびにトリガーで設定されたSQL文が実行されます。「FOR EACH STATEMENT」を指定すると何行のデータに対して処理が実行されてもトリガーで設定されたSQL文は一度しか実行されません。ただ、SQLiteでは現在「FOR EACH ROW」しか対応していません。その為「FOR EACH ROW」を省略しても「FOR EACH ROW」が設定されたものとみなされます。

またトリガー名の後にBEFOREを付けるとUPDATEやINSERTが実行される前にbeginからendの間に記述されたSQL文が実行されます。またAFTERを付けるとUPDATEやINSERTが実行された後にbeginからendの間に記述されたSQL文が実行されます。

サンプル

では実際に試してみます。

次のような2つのテーブルを用意します。

create table goods (id integer, name text, price integer, weight real);
create table log(id integer primary key, st text);

p1-1

まず「goods」テーブルに対してINSERTトリガー、DELETEトリガー、UPDATEトリガーを設定します。今回はトリガーの動作確認だけ行いたいので、各トリガーが実行さえれると「log」テーブルに記録だけをするようにします。

create trigger inserttrigger insert on goods
begin
insert into log(st) values('INSERT');
end;
create trigger deletetrigger delete on goods
begin
insert into log(st) values('DELETE');
end;
create trigger updatetrigger update on goods
begin
insert into log(st) values('UPDATE');
end;

p1-2

では「goods」テーブルに対してINSERT文、UPDATE文、DELETE文をそれぞれ実行してみます。

まずINSERT文を2回実行します。

p1-3

「log」テーブルの中身を確認します。

p1-4

続いてUPDATE文を実行します。

p1-5

「log」テーブルの中身を確認します。

p1-6

最後にDELETE文を実行します。

p1-7

「log」テーブルの中身を確認します。

p1-8

このようにトリガーが設定された処理が実行されると、各トリガーでBEGINからENDの間に書かれたSQL文が自動的に実行されます。