概要 :このチュートリアルでは、テーブル内のデータが変更されたときに自動的に起動されるデータベースオブジェクトであるSQLiteトリガーについて説明します。
SQLiteトリガーとは
SQLiteトリガーは、 INSERTのときに自動的に実行される名前付きデータベースオブジェクトです。 、 UPDATE またはDELETE ステートメントは、関連するテーブルに対して発行されます。
SQLiteトリガーが必要なのはいつですか
多くの場合、トリガーを使用して高度な監査を有効にします。たとえば、給与や住所などの機密データの変更を、変更されるたびにログに記録したいとします。
さらに、トリガーを使用して、複雑なビジネスルールをデータベースレベルで一元的に適用し、無効なトランザクションを防止します。
SQLite CREATE TRIGGER ステートメント
SQLiteで新しいトリガーを作成するには、 CREATE TRIGGERを使用します 次のようなステートメント:
CREATE TRIGGER [IF NOT EXISTS] trigger_name
[BEFORE|AFTER|INSTEAD OF] [INSERT|UPDATE|DELETE]
ON table_name
[WHEN condition]
BEGIN
statements;
END;Code language: SQL (Structured Query Language) (sql) この構文では:
- 最初に、
CREATE TRIGGERの後にトリガーの名前を指定します キーワード。 - 次に、
BEFOREなどのトリガーがいつ起動されるかを決定します 、AFTER、またはINSTEAD OF。BEFOREを作成できます およびAFTERテーブルでトリガーします。ただし、作成できるのはINSTEAD OFのみです。 ビューでトリガーします。 - 次に、
INSERTなど、トリガーが呼び出される原因となるイベントを指定します 、UPDATE、またはDELETE。 - その後、トリガーが属するテーブルを示します。
- 最後に、トリガーロジックを
BEGIN ENDに配置します ブロック。これは任意の有効なSQLステートメントにすることができます。
トリガーが発生する時間とトリガーが発生するイベントを組み合わせると、合計9つの可能性があります。
挿入前挿入後コード>更新前更新後削除前削除後-
INSTEAD OF INSERT -
INSTEAD OF DELETE -
INSTEAD OF UPDATE
UPDATEを使用するとします テーブル内の10行を更新するステートメントの場合、テーブルに関連付けられたトリガーが10回起動されます。このトリガーはFOREACH ROWと呼ばれます 引き金。テーブルに関連付けられたトリガーが1回起動された場合、このトリガーを FOR EACH STATEMENTと呼びます。 トリガー。
バージョン3.9.2の時点で、SQLiteは FOR EACH ROWのみをサポートします トリガー。 FOR EACH STATEMENTはまだサポートされていません トリガー。
WHENで条件を使用する場合 句では、条件が真の場合にのみトリガーが呼び出されます。 WHENを省略した場合 句を指定すると、トリガーはすべての行に対して実行されます。
テーブルを削除すると、関連するすべてのトリガーも削除されることに注意してください。ただし、トリガーが他のテーブルを参照している場合、他のテーブルが削除または更新されても、トリガーは削除または変更されません。
たとえば、トリガーは peopleという名前のテーブルを参照します 、 peopleを削除します テーブルまたは名前を変更するには、トリガーの定義を手動で変更する必要があります。
OLD を使用して、挿入、削除、または更新されている行のデータにアクセスできます。 およびNEW 次の形式の参照: OLD.column_name およびNEW.column_name 。
OLD およびNEW トリガーが発生する原因となるイベントに応じて、参照を利用できます。
次の表にルールを示します。:
| アクション | リファレンス |
|---|---|
| INSERT | NEWが利用可能です |
| 更新 | NEWとOLDの両方が利用可能です |
| 削除 | OLDが利用可能です |
SQLiteトリガーの例
会社のすべてのビジネスリードを保存するために、リードと呼ばれる新しいテーブルを作成しましょう。
CREATE TABLE leads (
id integer PRIMARY KEY,
first_name text NOT NULL,
last_name text NOT NULL,
phone text NOT NULL,
email text NOT NULL,
source text NOT NULL
);Code language: SQL (Structured Query Language) (sql) 1)SQLite BEFORE INSERT トリガーの例
Leadsに新しいリードを挿入する前にメールアドレスを検証するとします。 テーブル。この場合、 BEFORE INSERTを使用できます トリガー。
まず、 BEFORE INSERTを作成します 次のようにトリガーします:
CREATE TRIGGER validate_email_before_insert_leads
BEFORE INSERT ON leads
BEGIN
SELECT
CASE
WHEN NEW.email NOT LIKE '%_@__%.__%' THEN
RAISE (ABORT,'Invalid email address')
END;
END;Code language: SQL (Structured Query Language) (sql)
NEWを使用しました 挿入されている行の電子メール列にアクセスするための参照。
メールを検証するために、 LIKEを使用しました 電子メールのパターンに基づいて、電子メールが有効かどうかを判断する演算子。メールが無効な場合は、 RAISE 関数は挿入を中止し、エラーメッセージを発行します。
次に、無効なメールの行を Leadsに挿入します テーブル。
INSERT INTO leads (first_name,last_name,email,phone)
VALUES('John','Doe','jjj','4089009334');Code language: SQL (Structured Query Language) (sql) SQLiteはエラー「無効な電子メールアドレス」を発行し、挿入の実行を中止しました。
3番目に、有効なメールアドレスを含む行を挿入します。
INSERT INTO leads (first_name, last_name, email, phone)
VALUES ('John', 'Doe', 'john.doe@sqlitetutorial.net', '4089009334');Code language: SQL (Structured Query Language) (sql) 電子メールが有効であるため、挿入ステートメントは正常に実行されました。
SELECT
first_name,
last_name,
email,
phone
FROM
leads;Code language: SQL (Structured Query Language) (sql)
2)SQLite AFTER UPDATE トリガーの例
リードの電話やメールは非常に重要なので、この情報を失うわけにはいきません。たとえば、誰かが誤ってメールや電話を間違ったものに更新したり、削除したりします。
この貴重なデータを保護するには、トリガーを使用して、電話と電子メールに加えられたすべての変更をログに記録します。
まず、 Lead_logsという新しいテーブルを作成します 履歴データを保存します。
CREATE TABLE lead_logs (
id INTEGER PRIMARY KEY,
old_id int,
new_id int,
old_phone text,
new_phone text,
old_email text,
new_email text,
user_action text,
created_at text
);Code language: SQL (Structured Query Language) (sql)
次に、 AFTER UPDATEを作成します データをlead_logsに記録するトリガー emailに更新があるときはいつでもテーブル またはphone 列。
CREATE TRIGGER log_contact_after_update
AFTER UPDATE ON leads
WHEN old.phone <> new.phone
OR old.email <> new.email
BEGIN
INSERT INTO lead_logs (
old_id,
new_id,
old_phone,
new_phone,
old_email,
new_email,
user_action,
created_at
)
VALUES
(
old.id,
new.id,
old.phone,
new.phone,
old.email,
new.email,
'UPDATE',
DATETIME('NOW')
) ;
END;Code language: SQL (Structured Query Language) (sql)
WHENの状態にあることに気づきました 句は、電子メールまたは電話の列に変更があった場合にのみトリガーが呼び出されることを指定します。
3番目に、 Johnの名前を更新します Doeから Smithへ 。
UPDATE leads
SET
last_name = 'Smith'
WHERE
id = 1;Code language: SQL (Structured Query Language) (sql)
トリガーlog_contact_after_update メールや電話に変更がなかったため、呼び出されませんでした。
第4に、 Johnのメールアドレスと電話番号の両方を更新します 新しいものに。
UPDATE leads
SET
phone = '4089998888',
email = 'john.smith@sqlitetutorial.net'
WHERE
id = 1;Code language: SQL (Structured Query Language) (sql) ログテーブルを確認すると、そこに新しいエントリがあることがわかります。
SELECT
old_phone,
new_phone,
old_email,
new_email,
user_action
FROM
lead_logs;Code language: SQL (Structured Query Language) (sql)
AFTER INSERTを開発できます およびAFTERDELETE Lead_logsにデータを記録するためのトリガー 演習としてのテーブル。
SQLite DROP TRIGGER ステートメント
既存のトリガーを削除するには、 DROP TRIGGERを使用します 次のようなステートメント:
DROP TRIGGER [IF EXISTS] trigger_name;Code language: SQL (Structured Query Language) (sql) この構文では:
- 最初に、
DROP TRIGGERの後にドロップするトリガーの名前を指定します キーワード。 - 次に、
IF EXISTSを使用します トリガーが存在する場合にのみトリガーを削除するオプション。
テーブルをドロップすると、SQLiteはテーブルに関連付けられているすべてのトリガーを自動的にドロップすることに注意してください。
たとえば、 validate_email_before_insert_leadsを削除するには トリガーするには、次のステートメントを使用します:
DROP TRIGGER validate_email_before_insert_leads;Code language: SQL (Structured Query Language) (sql) このチュートリアルでは、SQLiteトリガーを紹介し、データベースからトリガーを作成および削除する方法を示します。