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;
INSERT、DELETE、UPDATE用のログトリガーを作成する。
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 UPDATEやBEFORE DELETEが対象行を変更すると、その後の動作は未定義になる場合がある。明示的に整数を設定しないBEFORE INSERTではNEW.rowidも未定義である。
FOR EACH ROW
SQLiteは現在、行単位のトリガーだけをサポートする。省略してもFOR EACH ROWとして動作し、文単位のトリガーは利用できない。