SQLite トリガー(Trigger)

SQLite トリガー(Trigger)データベースのコールバック関数であり、指定されたデータベースイベントが発生したときに自動的に実行/呼び出されます。以下は SQLite のトリガー(Trigger)に関する要点です:

  • SQLite のトリガー(Trigger)は、特定のデータベーステーブルで DELETE、INSERT、または UPDATE が発生したとき、または1つ以上の指定されたテーブルの列が更新されたときにトリガーされるように指定できます。

  • SQLite は FOR EACH ROW トリガー(Trigger)のみをサポートしており、FOR EACH STATEMENT トリガー(Trigger)はありません。したがって、FOR EACH ROW を明示的に指定することはオプションです。

  • WHEN 句とトリガー(Trigger)アクションは、次の形式を使用してNEW.column-nameとOLD.column-name挿入、削除、または更新された行要素を参照できます。ここで column-name は、トリガーに関連付けられたテーブルの列の名前です。

  • WHEN 句が指定されている場合、WHEN 句が真である指定された行に対してのみ SQL 文が実行されます。WHEN 句が指定されていない場合は、すべての行に対して SQL 文が実行されます。

  • BEFORE または AFTER キーワードは、トリガーアクションをいつ実行するかを決定し、関連する行の挿入、変更、または削除の前か後かにトリガーアクションを実行するかを決定します。

  • トリガーが関連付けられているテーブルが削除されると、トリガー(Trigger)も自動的に削除されます。

  • 変更するテーブルは、トリガーがアタッチされているテーブルまたはビューと同じデータベースに存在する必要があり、次のものだけを使用する必要がありますtablenameではなくdatabase.tablename。

  • 特別な SQL 関数 RAISE() を使用すると、トリガープログラム内で例外を発生させることができます。

構文

作成トリガー(Trigger)の基本的な構文は次のとおりです:

CREATE  TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- 触发器逻辑....
END;

ここで、event_name前述のテーブルに対するtable_name上のINSERT、DELETE、および UPDATEデータベース操作です。テーブル名の後に FOR EACH ROW を指定することもできます。

以下は、UPDATE 操作でテーブルの1つ以上の指定された列にトリガー(Trigger)を作成する構文です:

CREATE  TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name 
ON table_name
BEGIN
 -- 触发器逻辑....
END;

例

新しく作成された COMPANY テーブル(既に存在する場合は削除して再作成)に挿入されるすべてのレコードについて監査証跡を保持する場合を想定しましょう:

sqlite> CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

監査証跡を保持するために、AUDIT という名前の新しいテーブルを作成します。COMPANY テーブルに新しいレコードが追加されるたびに、ログメッセージがそのテーブルに挿入されます:

sqlite> CREATE TABLE AUDIT(
    EMP_ID INT NOT NULL,
    ENTRY_DATE TEXT NOT NULL
);

ここで、ID は AUDIT レコードの ID、EMP_ID は COMPANY テーブルの ID、DATE は COMPANY でレコードが作成された時刻のタイムスタンプを保持します。それでは、COMPANY テーブルに次のようにトリガーを作成しましょう:

sqlite> CREATE TRIGGER audit_log AFTER INSERT 
ON COMPANY
BEGIN
   INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
END;

次に、COMPANY テーブルにレコードを挿入します。これにより、AUDIT テーブルに監査ログレコードが作成されます。それでは、COMPANY テーブルに次のようにレコードを作成しましょう:

sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );

これにより、COMPANY テーブルに次のようなレコードが作成されます:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0

同時に、AUDIT テーブルにもレコードが作成されます。このレコードは、COMPANY テーブルの INSERT 操作に対して作成したトリガー(Trigger)の結果です。同様に、必要に応じて UPDATE および DELETE 操作に対してトリガー(Trigger)を作成できます。

EMP_ID      ENTRY_DATE
----------  -------------------
1           2013-04-05 06:26:00

トリガー(TRIGGERS)を一覧表示

次のsqlite_masterテーブルからすべてのトリガーを一覧表示できます。次のとおりです:

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger';

上記の SQLite ステートメントは、次のように1つのエントリのみを一覧表示します:

name
----------
audit_log

特定のテーブル上のトリガーを一覧表示する場合は、AND 句を使用してテーブル名を接続します。次のとおりです:

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'COMPANY';

上記の SQLite ステートメントは、次のように1つのエントリのみを一覧表示します:

name
----------
audit_log

トリガー(TRIGGERS)を削除

以下は、既存のトリガーを削除するために使用できる DROP コマンドです:

sqlite> DROP TRIGGER trigger_name;
その他の拡張