SQLiteのトリガー
【開発環境】
OS:Win10(64ビット)
データベース:SQLite3
コマンドプロンプト入力
【トリガー】
特定のテーブルのデータが更新されたら、同時に別のテーブルのデータを更新しておきたい場合があります。このような場合に使用されるのがトリガー
書式
CREATE TRIGGER トリガー名 [ BEFORE | AFTER | INSTEAD OF]
{ DELETE | UPDATE [OF カラム名, ...] | INSERT } ON テーブル名
[ FOR EACH ROW | FOR EACH STATEMENT ]
[ WHERE 条件式 ]
BEGIN
SQL文1;
SQL文2;
...
END;
何がきっかけでトリガーが起動するのかを指定し、どのSQL文を実行するのかを記述します。きっかけとなる SQL 文は UPDATE 文、 INSERT 文、そして DELETE 文があります。
例文
CREATE TRIGGER トリガー名 UPDATE ON テーブル名
BEGIN
SQL文1;
SQL文2;
...
END;
或いは
CREATE TRIGGER トリガー名 UPDATE OF カラム名 ON テーブル名
BEGIN
SQL文1;
SQL文2;
...
END;
【トリガの実践】
まず、2つのテーブルを用意する。
Microsoft Windows [Version 10.0.18363.900]
(c) 2019 Microsoft Corporation. All rights reserved.
C:\Users\shyok>cd D:\pg\sqlite3
C:\Users\shyok>d:
D:\pg\sqlite3>
D:\pg\sqlite3>sqlite3 D:\pg\sqlite3\myfriend.sqlite3
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite>
sqlite> .heade on
sqlite> .mode column
sqlite>
sqlite> create table product(id integer, name text, price integer);すでに有った。
Error: table product already exists
sqlite> create table log(id integer primary key, act text);
sqlite> .tables
Tuser numtest1 product tokyouser
log personal staff user
sqlite>
■product テーブルを対象に3つのトリガーを作成
sqlite>
product テーブルにデータが追加/削除/更新された時にそれぞれトリガーが起動し、 log テーブルの act カラムにログを記録していきます。
追加
sqlite> create trigger itrigger insert on product
...> begin
...> insert into log(act) values('INSERT Action');
...> end;
sqlite>
削除
sqlite> create trigger dtrigger delete on product
...> begin
...> insert into log(act) values('DELETE Action');
...> end;
sqlite>
更新
sqlite> create trigger utrigger update on product
...> begin
...> insert into log(act) values('UPDATE Action');
...> end;
sqlite>
実践してみる
product テーブルへデータが追加すると同時にトリガーが起動して log テーブルにデータを追加しています。
追加
sqlite> insert into product values(1, 'Book', 1500);
sqlite>
sqlite> select * from log;
1|INSERT Action
sqlite>
更新
sqlite> update product set price = 2500 where id = 1;
sqlite> select * from log;
id act
---------- -------------
1 INSERT Action
2 UPDATE Action
3 UPDATE Action
sqlite>
sqlite> delete from product where id = 1;
sqlite> select * from log;
id act
---------- -------------
1 INSERT Action
2 UPDATE Action
3 UPDATE Action
4 DELETE Action
5 DELETE Action
sqlite>
■作成済みのトリガーを削除する
書式
DROP TRIGGER トリガー名;
sqlite>
確認
sqlite> .schema
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;
sqlite>
sqlite> drop trigger utrigger;
utrigger が消えている事を確認!
sqlite> .schema
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;
sqlite>
※コメント投稿者のブログIDはブログ作成者のみに通知されます