0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SQLite】トリガーの種類と設定方法|INSERT・UPDATE・DELETE時に処理を自動実行する

0
Posted at

はじめに

本記事では、SQLiteにおけるトリガーの種類と設定方法をまとめます。

トリガーを使うことで、INSERT・UPDATE・DELETEの実行時に
自動的に別の処理を走らせることができます。

実行環境

項目 内容
DB SQLite 3.x
OS Windows 11

1. トリガーとは

テーブルへの操作をきっかけに、自動実行されるSQL処理です。

INSERT / UPDATE / DELETE
        ↓
    トリガー発火
        ↓
   自動的に別のSQLが実行される

アプリケーション側に処理を書かずに、
DB側で自動的に処理を完結させることができます。


2. トリガーの種類

タイミングによる分類

タイミング 説明
BEFORE 対象の操作が実行される前に発火
AFTER 対象の操作が実行された後に発火
INSTEAD OF VIEWへの操作を代替処理に置き換える

操作による分類

操作 説明
INSERT 行が追加されたときに発火
UPDATE 行が更新されたときに発火
DELETE 行が削除されたときに発火

3. 基本構文

CREATE TRIGGER トリガー名
    [BEFORE | AFTER] [INSERT | UPDATE | DELETE]
    ON テーブル名
BEGIN
    実行するSQL;
END;

4. 実践例

① AFTER INSERT:登録日時を自動記録する

-- ログテーブル
CREATE TABLE order_log (
    id         INTEGER PRIMARY KEY,
    order_id   INTEGER,
    created_at TEXT
);

-- INSERTされたら自動でログを記録する
CREATE TRIGGER log_after_insert
    AFTER INSERT ON order_table
BEGIN
    INSERT INTO order_log (order_id, created_at)
    VALUES (NEW.id, datetime('now', 'localtime'));
END;

NEWはINSERT・UPDATEで新しく追加・変更された行の値を参照します。
OLDはUPDATE・DELETEで変更前・削除された行の値を参照します。


② BEFORE DELETE:削除前に別テーブルへバックアップする

-- バックアップテーブル
CREATE TABLE order_backup (
    id         INTEGER,
    part_id    INTEGER,
    quantity   INTEGER,
    deleted_at TEXT
);

-- 削除前にバックアップテーブルへ退避
CREATE TRIGGER backup_before_delete
    BEFORE DELETE ON order_table
BEGIN
    INSERT INTO order_backup (id, part_id, quantity, deleted_at)
    VALUES (OLD.id, OLD.part_id, OLD.quantity, datetime('now', 'localtime'));
END;

③ AFTER UPDATE:更新履歴を記録する

-- 更新履歴テーブル
CREATE TABLE order_history (
    id           INTEGER PRIMARY KEY,
    order_id     INTEGER,
    old_quantity INTEGER,
    new_quantity INTEGER,
    updated_at   TEXT
);

-- UPDATEされたら変更前後の値を記録
CREATE TRIGGER log_after_update
    AFTER UPDATE ON order_table
BEGIN
    INSERT INTO order_history (order_id, old_quantity, new_quantity, updated_at)
    VALUES (OLD.id, OLD.quantity, NEW.quantity, datetime('now', 'localtime'));
END;

5. トリガーの確認・削除

-- 登録済みトリガーの一覧確認
SELECT name, tbl_name, sql
FROM sqlite_master
WHERE type = 'trigger';

-- トリガーの削除
DROP TRIGGER IF EXISTS トリガー名;

6. NEW / OLD の参照可否まとめ

操作 NEW OLD
INSERT ✅ 使える ❌ 使えない
UPDATE ✅ 使える ✅ 使える
DELETE ❌ 使えない ✅ 使える

まとめ

用途 使うトリガー
登録日時の自動記録 AFTER INSERT
削除前のバックアップ BEFORE DELETE
更新履歴の保存 AFTER UPDATE
VIEWへの書き込み処理 INSTEAD OF

トリガーを活用することで、アプリケーション側の処理を減らし
DBレベルで一貫した自動処理を実現できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?