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;