Sammanfattning :denna handledning diskuterar SQLite trigger, som är ett databasobjekt som aktiveras automatiskt när data i en tabell ändras.
Vad är en SQLite-utlösare
En SQLite-utlösare är ett namngivet databasobjekt som exekveras automatiskt när en INSERT , UPDATE eller DELETE uttalande utfärdas mot den tillhörande tabellen.
När behöver vi SQLite-utlösare
Du använder ofta triggers för att möjliggöra sofistikerad revision. Du vill till exempel logga ändringarna i känsliga uppgifter som lön och adress när de ändras.
Dessutom använder du triggers för att upprätthålla komplexa affärsregler centralt på databasnivå och förhindra ogiltiga transaktioner.
SQLite CREATE TRIGGER uttalande
För att skapa en ny trigger i SQLite använder du CREATE TRIGGER uttalande enligt följande:
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) I denna syntax:
- Ange först namnet på utlösaren efter
CREATE TRIGGERsökord. - Använd sedan när utlösaren aktiveras, till exempel
BEFORE,AFTER, ellerINSTEAD OF. Du kan skapaBEFOREochAFTERutlösare på ett bord. Du kan dock bara skapa enINSTEAD OFutlösare på en vy. - Ange sedan händelsen som gör att utlösaren anropas, såsom
INSERT,UPDATE, ellerDELETE. - Ange därefter tabellen som utlösaren tillhör.
- Slutligen placerar du triggerlogiken i
BEGIN ENDblock, vilket kan vara valfri giltig SQL-sats.
Om du kombinerar tiden när avtryckaren aktiveras och händelsen som gör att avtryckaren aktiveras, har du totalt 9 möjligheter:
BEFORE INSERTAFTER INSERTBEFORE UPDATEAFTER UPDATEBEFORE DELETEAFTER DELETEINSTEAD OF INSERTINSTEAD OF DELETEINSTEAD OF UPDATE
Anta att du använder en UPDATE för att uppdatera 10 rader i en tabell, aktiveras triggern som är associerad med tabellen 10 gånger. Denna utlösare kallas FOR EACH ROW utlösare. Om triggern som är kopplad till tabellen aktiveras en gång, kallar vi denna trigger för en FOR EACH STATEMENT utlösare.
Från och med version 3.9.2 stöder SQLite endast FOR EACH ROW utlösare. Den har ännu inte stöd för FOR EACH STATEMENT utlösare.
Om du använder ett villkor i WHEN klausulen anropas utlösaren endast när villkoret är sant. Om du utelämnar WHEN klausul, utlösaren exekveras för alla rader.
Lägg märke till att om du släpper en tabell raderas också alla associerade triggers. Men om utlösaren refererar till andra tabeller tas utlösaren inte bort eller ändras om andra tabeller tas bort eller uppdateras.
En trigger refererar till exempel till en tabell med namnet people , släpper du people tabell eller byta namn på den, måste du manuellt ändra definitionen av utlösaren.
Du kan komma åt data för raden som infogas, raderas eller uppdateras med OLD och NEW referenser i formen:OLD.column_name och NEW.column_name .
den OLD och NEW referenser är tillgängliga beroende på händelsen som gör att utlösaren aktiveras.
Följande tabell illustrerar reglerna.:
| Åtgärd | Referens |
|---|---|
| INSERT | NYTT är tillgängligt |
| UPPDATERA | Både NYA och GAMLA är tillgängliga |
| RADERA | OLD är tillgängligt |
SQLite utlöser exempel
Låt oss skapa en ny tabell som heter leads för att lagra alla företags leads för företaget.
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 triggerexempel
Anta att du vill validera e-postadressen innan du infogar en ny potentiell kund i leads tabell. I det här fallet kan du använda en BEFORE INSERT utlösare.
Skapa först en BEFORE INSERT trigger enligt följande:
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)
Vi använde NEW referens för att komma åt e-postkolumnen för raden som infogas.
För att validera e-postmeddelandet använde vi LIKE operatör för att avgöra om e-postmeddelandet är giltigt eller inte baserat på e-postmönstret. Om e-postmeddelandet inte är giltigt, RAISE funktionen avbryter infogningen och ger ett felmeddelande.
För det andra, infoga en rad med en ogiltig e-post i leads bord.
INSERT INTO leads (first_name,last_name,email,phone)
VALUES('John','Doe','jjj','4089009334');Code language: SQL (Structured Query Language) (sql) SQLite utfärdade ett fel:"Ogiltig e-postadress" och avbröt exekveringen av infogningen.
För det tredje, infoga en rad med en giltig e-postadress.
INSERT INTO leads (first_name, last_name, email, phone)
VALUES ('John', 'Doe', 'john.doe@sqlitetutorial.net', '4089009334');Code language: SQL (Structured Query Language) (sql) Eftersom e-postmeddelandet är giltigt kördes insert-satsen framgångsrikt.
SELECT
first_name,
last_name,
email,
phone
FROM
leads;Code language: SQL (Structured Query Language) (sql)
2) SQLite AFTER UPDATE triggerexempel
Ledarnas telefoner och e-postmeddelanden är så viktiga att du inte har råd att förlora denna information. Till exempel, någon av misstag uppdaterar e-postmeddelandet eller telefonen till fel eller till och med raderar det.
För att skydda denna värdefulla data använder du en trigger för att logga alla ändringar som görs i telefonen och e-posten.
Skapa först en ny tabell som heter lead_logs för att lagra historiska data.
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)
För det andra, skapa en AFTER UPDATE trigger för att logga data till lead_logs tabell när det finns en uppdatering i email eller phone kolumn.
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)
Du märker det i tillståndet i WHEN klausul anger att utlösaren endast anropas när det finns en ändring i antingen e-post- eller telefonkolumnen.
För det tredje, uppdatera efternamnet på John från Doe till Smith .
UPDATE leads
SET
last_name = 'Smith'
WHERE
id = 1;Code language: SQL (Structured Query Language) (sql)
Utlösaren log_contact_after_update anropades inte eftersom det inte fanns någon förändring i e-post eller telefon.
För det fjärde, uppdatera både e-post och telefon för John till de nya.
UPDATE leads
SET
phone = '4089998888',
email = 'john.smith@sqlitetutorial.net'
WHERE
id = 1;Code language: SQL (Structured Query Language) (sql) Om du kontrollerar loggtabellen ser du att det finns en ny post där.
SELECT
old_phone,
new_phone,
old_email,
new_email,
user_action
FROM
lead_logs;Code language: SQL (Structured Query Language) (sql)
Du kan utveckla AFTER INSERT och AFTER DELETE triggers för att logga data i lead_logs bord som en övning.
SQLite DROP TRIGGER uttalande
För att släppa en befintlig trigger använder du DROP TRIGGER uttalande enligt följande:
DROP TRIGGER [IF EXISTS] trigger_name;Code language: SQL (Structured Query Language) (sql) I denna syntax:
- Ange först namnet på utlösaren som du vill släppa efter
DROP TRIGGERsökord. - Använd för det andra koden
IF EXISTSalternativet för att ta bort utlösaren endast om den finns.
Observera att om du släpper en tabell kommer SQLite automatiskt att ta bort alla triggers som är associerade med tabellen.
Till exempel för att ta bort validate_email_before_insert_leads trigger använder du följande uttalande:
DROP TRIGGER validate_email_before_insert_leads;Code language: SQL (Structured Query Language) (sql) I den här handledningen har vi introducerat dig till SQLite-utlösare och visar dig hur du skapar och släpper utlösare från databasen.