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 TRIGGER
sökord. - Använd sedan när utlösaren aktiveras, till exempel
BEFORE
,AFTER
, ellerINSTEAD OF
. Du kan skapaBEFORE
ochAFTER
utlösare på ett bord. Du kan dock bara skapa enINSTEAD OF
utlö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 END
block, 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 INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
INSTEAD OF INSERT
INSTEAD OF DELETE
INSTEAD 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', '[email protected]', '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 = '[email protected]'
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 TRIGGER
sökord. - Använd för det andra koden
IF EXISTS
alternativet 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.