English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQLiteトリガー(トリガー)

SQLiteトリガーはデータベースコールバック関数であり、指定されたデータベースイベントが発生した場合に自動的に実行されます/これらの関数を呼び出します。以下はSQLiteトリガーのポイントに関する情報です-

  • SQLiteのトリガー(トリガー)は、特定のデータベーステーブルがDELETE、INSERT、またはUPDATEが発生した場合、または指定されたテーブルの列が更新された場合にトリガーを発生させることを指定できます。

  • SQLiteはFOR EACH ROWトリガー(トリガー)のみをサポートし、FOR EACH STATEMENTトリガー(トリガー)はありません。したがって、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()は、トリガープログラム内で例外を投げることができます。

文法

以下は、トリガーを作成するための基本的な文法です。

CREATE  TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- トリガーロジック...
END;

ここでは、event_nameこれらのテーブルに対してINSERT、DELETEおよびUPDATEデータベース操作table_name。テーブル名の後にFOR EACH ROWを指定することができます。

以下は、テーブルの1つまたは複数の指定列に対してUPDATE操作でトリガーを作成する文法です。

CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name 
ON table_name
BEGIN
   -- トリガーロジックはここにあります...
END;

考えてみてください、COMPANYテーブルに挿入される各レコードに対して監査試行を行いたいという状況を。これは新しく作成したもので、以下のように示します(既に存在する場合はCOMPANYテーブルを削除します)。

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

审计テスト状態を維持するために、COMPANYテーブルに新しいレコードが追加されるたびに、AUDITという名前の新しいテーブルを作成し、そのテーブルにログメッセージを挿入します。

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操作上で作成したトリガーの結果です。同様に、必要に応じてUPDATEおよびDELETE操作上でトリガーを作成できます。

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

トリガーをリストアップ

以下から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 ステートメントは、以下のように一つのエントリのみを表示します。-

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

トリガーの削除

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

sqlite> DROP TRIGGER trigger_name;