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 TRIGGER
klíčová slova. - Dále určete, kdy je spouštěč spuštěn, například
BEFORE
,AFTER
, neboINSTEAD OF
. Můžete vytvořitBEFORE
aAFTER
spouště na stole. Můžete však vytvořit pouzeINSTEAD OF
spustit při pohledu. - Poté zadejte událost, která způsobí vyvolání spouštěče, například
INSERT
,UPDATE
neboDELETE
. - Poté označte tabulku, do které spouštěč patří.
- Nakonec umístěte spouštěcí logiku do
BEGIN END
blok, 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 INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
INSTEAD OF INSERT
INSTEAD OF DELETE
INSTEAD 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', '[email protected]', '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 = '[email protected]'
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 TRIGGER
klíčová slova. - Zadruhé použijte
IF EXISTS
mož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.