【SQL実践|実務向け】SQLiteトリガー活用術:データ整合性を自動化する実装テクニック

1. 導入: なぜトリガーが重要なのか

データベースの運用において、アプリケーション側で「Aテーブルを更新したら、Bテーブルも更新する」といった処理を実装すると、プログラムのバグや通信断によってデータの不整合が生じるリスクがあります。SQLiteのトリガー機能を使えば、データベースエンジン側で更新を検知し、自動的に関連処理を実行できます。これにより、アプリケーションのロジックに依存せず、データの整合性を強固に保つことが可能になります。

2. 基礎知識: トリガーとは何か

トリガー(Trigger)とは、特定のテーブルに対してINSERT、UPDATE、DELETEといった操作が行われた際、自動的に特定のSQL文を実行させるデータベースオブジェクトです。
SQLiteでは、以下の要素で構成されます。
タイミング: BEFORE(操作前)または AFTER(操作後)。
イベント: どの操作(INSERT/UPDATE/DELETE)をトリガーにするか。
対象テーブル: どのテーブルの操作を監視するか。

3. 実装/解決策: 監査ログの自動生成

実務で最もよく使われるケースの一つが「監査ログの自動記録」です。ユーザーテーブルが更新された際、その変更内容を履歴テーブルに自動コピーする実装を行います。

4. サンプルプログラム

以下のSQLは、usersテーブルが更新された際、その変更前後のデータをhistoryテーブルに自動保存する例です。

— 1. 履歴用テーブルの作成
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT);
CREATE TABLE user_history (id INTEGER PRIMARY KEY, user_id INTEGER, old_name TEXT, updated_at DATETIME);

— 2. 更新時に動作するトリガーの作成
CREATE TRIGGER after_user_update
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
— OLDは更新前の値、NEWは更新後の値を参照するSQLiteの予約語です
INSERT INTO user_history (user_id, old_name, updated_at)
VALUES (OLD.id, OLD.name, DATETIME(‘now’));
END;

— 3. 動作確認用のデータ挿入と更新
INSERT INTO users (id, name, email) VALUES (1, ‘田中’, ‘tanaka@example.com’);
— このUPDATE文が実行されると、自動的にトリガーが起動します
UPDATE users SET name = ‘佐藤’ WHERE id = 1;

— 4. 結果確認
SELECT FROM user_history;

5. 応用・注意点: 現場での運用ルール

トリガーは非常に強力ですが、以下の点に注意が必要です。

・デバッグの難しさ: トリガーはバックグラウンドで動くため、エラーが発生した際にアプリケーション側のログに直接出ない場合があります。トリガー内で複雑なロジックを組むのは避け、なるべく単純な操作に留めるのが鉄則です。
・パフォーマンスへの影響: 大量データを一括処理する際、トリガーが毎回起動することで処理速度が大幅に低下することがあります。バルクインサートを行う際は、一時的にトリガーを無効化する運用フローを検討してください。
・可読性の維持: どのテーブルにどんなトリガーが設定されているかは、以下のコマンドで確認できます。
SELECT name FROM sqlite_master WHERE type = ‘trigger’;
開発時は、トリガーの存在をドキュメント化し、後任者が「なぜデータが勝手に更新されるのか」と迷わないよう配慮しましょう。

コメント

タイトルとURLをコピーしました