Резюме :този урок обсъжда 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 възможности:
BEFORE INSERTAFTER INSERTBEFORE UPDATEAFTER UPDATEBEFORE DELETEAFTER DELETEINSTEAD OF INSERTINSTEAD OF DELETEINSTEAD OF UPDATE
Да предположим, че използвате UPDATE оператор за актуализиране на 10 реда в таблица, тригерът, свързан с таблицата, се задейства 10 пъти. Този тригер се нарича FOR EACH ROW задействане. Ако тригерът, свързан с таблицата, се задейства веднъж, ние наричаме това задействане 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 | НОВО е налично |
| АКТУАЛИЗИРАНЕ | И НОВИ, и СТАРИ са налични |
| ИЗТРИВАНЕ | 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 издаде грешка:„Невалиден имейл адрес“ и прекъсна изпълнението на вмъкването.
Трето, поставете ред с валиден имейл.
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 Клаузата указва, че тригерът се извиква само когато има промяна в колоната за имейл или телефон.
Трето, актуализирайте фамилното име на John от Doe до Smith .
UPDATE leads
SET
last_name = 'Smith'
WHERE
id = 1;Code language: SQL (Structured Query Language) (sql)
Тригерът log_contact_after_update не беше извикан, защото нямаше промяна в имейла или телефона.
Четвърто, актуализирайте имейла и телефона на 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 и AFTER DELETE задейства за регистриране на данните в 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 и ви показваме как да създавате и пускате тригери от базата данни.