SQLite-トリガー
SQLite Triggersデータベースコールバック関数であり、指定されたデータベースイベントが発生すると自動的に実行/呼び出されます。以下はSQLiteトリガーに関する重要なポイントです-
SQLiteトリガーは、特定のデータベーステーブルのDELETE、INSERT、またはUPDATEが発生するたび、またはテーブルの1つ以上の指定された列でUPDATEが発生するたびに起動するように指定できます。
現時点では、SQLiteはFOR EACH ROWトリガーのみをサポートし、FOR EACHSTATEMENTトリガーはサポートしていません。したがって、FOR EACHROWを明示的に指定することはオプションです。
WHEN句とトリガーアクションの両方が、フォームの参照を使用して、挿入、削除、または更新される行の要素にアクセスできます。 NEW.column-name そして OLD.column-name、ここで、column-nameは、トリガーが関連付けられているテーブルの列の名前です。
WHEN句が指定されている場合、指定されたSQLステートメントは、WHEN句が真である行に対してのみ実行されます。WHEN句が指定されていない場合、SQLステートメントはすべての行に対して実行されます。
BEFOREまたはAFTERキーワードは、関連する行の挿入、変更、または削除に関連してトリガーアクションがいつ実行されるかを決定します。
トリガーは、関連付けられているテーブルが削除されると自動的に削除されます。
変更するテーブルは、トリガーがアタッチされているテーブルまたはビューと同じデータベースに存在する必要があり、 tablename ない database.tablename。
特別なSQL関数RAISE()をトリガープログラム内で使用して、例外を発生させることができます。
構文
以下は、作成の基本的な構文です。 trigger。
CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name
ON table_name
BEGIN
-- Trigger logic goes here....
END;
ここに、 event_name上記のテーブルでのINSERT、DELETE、およびUPDATEデータベース操作である可能性がありますtable_name。オプションで、テーブル名の後にFOR EACHROWを指定できます。
以下は、テーブルの1つ以上の指定された列に対するUPDATE操作でトリガーを作成するための構文です。
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
BEGIN
-- Trigger logic goes here....
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テーブルに1つのレコードを作成します-
sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );
これにより、COMPANYテーブルに次のような1つのレコードが作成されます。
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
同時に、AUDITテーブルに1つのレコードが作成されます。このレコードは、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ステートメントでは、次のように1つのエントリのみがリストされます。
name
----------
audit_log
ドロップトリガー
以下は、既存のトリガーをドロップするために使用できるDROPコマンドです。
sqlite> DROP TRIGGER trigger_name;