Резюме :този урок обсъжда 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 INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
INSTEAD OF INSERT
INSTEAD OF DELETE
INSTEAD 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', '[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
Клаузата указва, че тригерът се извиква само когато има промяна в колоната за имейл или телефон.
Трето, актуализирайте фамилното име на 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 = '[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
и 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 и ви показваме как да създавате и пускате тригери от базата данни.