トリガーの作成
トリガーの作成方法を確認します。基本となる構文は下記の通りです。
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);
まず「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;
では「goods」テーブルに対してINSERT文、UPDATE文、DELETE文をそれぞれ実行してみます。
まずINSERT文を2回実行します。
「log」テーブルの中身を確認します。
続いてUPDATE文を実行します。
「log」テーブルの中身を確認します。
最後にDELETE文を実行します。
「log」テーブルの中身を確認します。
このようにトリガーが設定された処理が実行されると、各トリガーでBEGINからENDの間に書かれたSQL文が自動的に実行されます。