Shrnutí :tento tutoriál pojednává o spouštění SQLite, což je databázový objekt spouštěný automaticky při změně dat v tabulce.
Co je spouštěč SQLite
Spouštěč SQLite je pojmenovaný databázový objekt, který se automaticky spustí při INSERT , UPDATE nebo DELETE je vydán příkaz k příslušné tabulce.
Kdy potřebujeme spouštěče SQLite
Spouštěče často používáte k aktivaci sofistikovaného auditování. Chcete například zaznamenat změny v citlivých datech, jako je plat a adresa, kdykoli se změní.
Kromě toho používáte spouštěče k vynucení složitých obchodních pravidel centrálně na úrovni databáze a zabránění neplatným transakcím.
SQLite CREATE TRIGGER prohlášení
Chcete-li vytvořit nový spouštěč v SQLite, použijte CREATE TRIGGER prohlášení takto:
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) V této syntaxi:
- Nejprve zadejte název spouštěče za
CREATE TRIGGERklíčová slova. - Dále určete, kdy je spouštěč spuštěn, například
BEFORE,AFTER, neboINSTEAD OF. Můžete vytvořitBEFOREaAFTERspouště na stole. Můžete však vytvořit pouzeINSTEAD OFspustit při pohledu. - Poté zadejte událost, která způsobí vyvolání spouštěče, například
INSERT,UPDATEneboDELETE. - Poté označte tabulku, do které spouštěč patří.
- Nakonec umístěte spouštěcí logiku do
BEGIN ENDblok, což mohou být libovolné platné příkazy SQL.
Pokud zkombinujete čas, kdy je trigger aktivován, a událost, která způsobí jeho spuštění, máte celkem 9 možností:
BEFORE INSERTAFTER INSERTBEFORE UPDATEAFTER UPDATEBEFORE DELETEAFTER DELETEINSTEAD OF INSERTINSTEAD OF DELETEINSTEAD OF UPDATE
Předpokládejme, že používáte UPDATE Chcete-li aktualizovat 10 řádků v tabulce, spouštěč přidružený k tabulce se spustí 10krát. Toto pravidlo se nazývá FOR EACH ROW spoušť. Pokud je spouštěč přidružený k tabulce aktivován jednou, nazýváme jej FOR EACH STATEMENT spoušť.
Od verze 3.9.2 SQLite podporuje pouze FOR EACH ROW spouštěče. Dosud nepodporuje FOR EACH STATEMENT spouští.
Pokud použijete podmínku v WHEN klauzule, je spouštěč vyvolán pouze tehdy, když je podmínka pravdivá. V případě, že vynecháte WHEN klauzule, trigger se provede pro všechny řádky.
Všimněte si, že pokud pustíte tabulku, odstraní se také všechny související spouštěče. Pokud však spouštěč odkazuje na jiné tabulky, spouštěč se neodstraní ani nezmění, pokud jsou odstraněny nebo aktualizovány jiné tabulky.
Například spouštěč odkazuje na tabulku s názvem people , vypustíte people tabulku nebo ji přejmenovat, musíte ručně změnit definici spouštěče.
K datům řádku, který se vkládá, odstraňuje nebo aktualizuje, můžete přistupovat pomocí OLD a NEW odkazy ve tvaru:OLD.column_name a NEW.column_name .
OLD a NEW odkazy jsou dostupné v závislosti na události, která způsobí spuštění spouštěče.
Následující tabulka ilustruje pravidla.:
| Akce | Reference |
|---|---|
| INSERT | NOVÉ je k dispozici |
| AKTUALIZACE | K dispozici jsou NOVÉ i STARÉ |
| SMAZAT | OLD je k dispozici |
Příklady spouštění SQLite
Vytvořme novou tabulku nazvanou potenciální zákazníci, abychom uložili všechny obchodní potenciální zákazníky společnosti.
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 příklad spouště
Předpokládejme, že chcete ověřit e-mailovou adresu před vložením nového potenciálního zákazníka do leads stůl. V tomto případě můžete použít BEFORE INSERT spoušť.
Nejprve vytvořte BEFORE INSERT spusťte následovně:
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)
Použili jsme NEW odkaz pro přístup ke sloupci e-mailu v řádku, který se vkládá.
K ověření e-mailu jsme použili LIKE operátora, který na základě vzoru e-mailu určí, zda je e-mail platný či nikoli. Pokud e-mail není platný, RAISE funkce přeruší vkládání a vydá chybovou zprávu.
Za druhé, vložte řádek s neplatným e-mailem do leads tabulka.
INSERT INTO leads (first_name,last_name,email,phone)
VALUES('John','Doe','jjj','4089009334');Code language: SQL (Structured Query Language) (sql) SQLite vydalo chybu:„Neplatná e-mailová adresa“ a přerušilo provádění vložení.
Za třetí vložte řádek s platným e-mailem.
INSERT INTO leads (first_name, last_name, email, phone)
VALUES ('John', 'Doe', 'john.doe@sqlitetutorial.net', '4089009334');Code language: SQL (Structured Query Language) (sql) Protože je e-mail platný, příkaz vložení byl úspěšně proveden.
SELECT
first_name,
last_name,
email,
phone
FROM
leads;Code language: SQL (Structured Query Language) (sql)
2) SQLite AFTER UPDATE příklad spouště
Telefony a e-maily potenciálních zákazníků jsou tak důležité, že si nemůžete dovolit tyto informace ztratit. Někdo například omylem aktualizuje e-mail nebo telefon na nesprávné nebo je dokonce smaže.
Chcete-li tato cenná data chránit, pomocí spouštěče zaznamenáte všechny změny provedené v telefonu a e-mailu.
Nejprve vytvořte novou tabulku s názvem lead_logs pro uložení historických dat.
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)
Zadruhé vytvořte AFTER UPDATE spouštěče pro protokolování dat do lead_logs tabulky vždy, když je v email aktualizace nebo phone sloupec.
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)
Všimnete si, že ve stavu v WHEN klauzule určuje, že spouštěč je vyvolán pouze tehdy, když dojde ke změně buď ve sloupci e-mailu nebo telefonu.
Za třetí, aktualizujte příjmení John z Doe na Smith .
UPDATE leads
SET
last_name = 'Smith'
WHERE
id = 1;Code language: SQL (Structured Query Language) (sql)
Spouštěč log_contact_after_update nebylo vyvoláno, protože nedošlo k žádné změně e-mailu ani telefonu.
Za čtvrté, aktualizujte e-mail a telefon John k novým.
UPDATE leads
SET
phone = '4089998888',
email = 'john.smith@sqlitetutorial.net'
WHERE
id = 1;Code language: SQL (Structured Query Language) (sql) Pokud zkontrolujete tabulku protokolů, uvidíte, že je tam nový záznam.
SELECT
old_phone,
new_phone,
old_email,
new_email,
user_action
FROM
lead_logs;Code language: SQL (Structured Query Language) (sql)
Můžete vytvořit AFTER INSERT a AFTER DELETE spustí protokolování dat do lead_logs stůl jako cvičení.
SQLite DROP TRIGGER prohlášení
Chcete-li zahodit existující spouštěč, použijte DROP TRIGGER prohlášení takto:
DROP TRIGGER [IF EXISTS] trigger_name;Code language: SQL (Structured Query Language) (sql) V této syntaxi:
- Nejprve zadejte název spouštěče, který chcete vypustit po
DROP TRIGGERklíčová slova. - Zadruhé použijte
IF EXISTSmožnost odstranit spouštěč, pouze pokud existuje.
Všimněte si, že pokud zrušíte tabulku, SQLite automaticky zruší všechny spouštěče spojené s tabulkou.
Chcete-li například odstranit validate_email_before_insert_leads trigger, použijete následující příkaz:
DROP TRIGGER validate_email_before_insert_leads;Code language: SQL (Structured Query Language) (sql) V tomto tutoriálu jsme vám představili spouštěče SQLite a ukázali vám, jak vytvářet spouštěče a rušit je z databáze.