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