概要 :このチュートリアルでは、テーブル内のデータが変更されたときに自動的に起動されるデータベースオブジェクトである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', '[email protected]', '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 = '[email protected]'
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トリガーを紹介し、データベースからトリガーを作成および削除する方法を示します。