SQLite | トリガー | トリガーの作成

トリガーは、指定したテーブルのデータが変更されたときにSQLを自動実行する。

CREATE TRIGGER trigger_name [BEFORE | AFTER | INSTEAD OF]
 {DELETE | UPDATE [OF column_name, ...] | INSERT} ON table_name
 [FOR EACH ROW] [WHEN condition]
BEGIN
  statement1;
END;

INSERTDELETEUPDATE用のログトリガーを作成する。

create table product(id integer, name text, price integer);
create table log(id integer primary key, act text);
create trigger itrigger insert on product begin
 insert into log(act) values('INSERT Action'); end;
create trigger dtrigger delete on product begin
 insert into log(act) values('DELETE Action'); end;
create trigger utrigger update on product begin
 insert into log(act) values('UPDATE Action'); end;
insert into product values (1, 'Book', 15000);
update product set price = 25000 where id = 1;
delete from product where id = 1;

logにはINSERT、UPDATE、DELETEの3行が記録される。

BEFOREとAFTER

BEFOREは変更前、AFTERは変更後に本体を実行する。SQLiteは可能ならAFTERを推奨する。BEFORE UPDATEBEFORE DELETEが対象行を変更すると、その後の動作は未定義になる場合がある。明示的に整数を設定しないBEFORE INSERTではNEW.rowidも未定義である。

FOR EACH ROW

SQLiteは現在、行単位のトリガーだけをサポートする。省略してもFOR EACH ROWとして動作し、文単位のトリガーは利用できない。