Oversigt :denne vejledning diskuterer SQLite trigger, som er et databaseobjekt, der udløses automatisk, når dataene i en tabel ændres.
Hvad er en SQLite-trigger
En SQLite-trigger er et navngivet databaseobjekt, der udføres automatisk, når en INSERT
, OPDATERING
eller SLET
erklæring afgives mod den tilhørende tabel.
Hvornår har vi brug for SQLite-triggere
Du bruger ofte triggere til at muliggøre sofistikeret revision. For eksempel vil du logge ændringerne i de følsomme data, såsom løn og adresse, når de ændres.
Derudover bruger du triggere til at håndhæve komplekse forretningsregler centralt på databaseniveau og forhindre ugyldige transaktioner.
SQLite OPRET TRIGGER
erklæring
For at oprette en ny trigger i SQLite, bruger du CREATE TRIGGER
erklæring som følger:
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 denne syntaks:
- Først skal du angive navnet på triggeren efter
CREATE TRIGGER
søgeord. - Nu skal du bestemme, hvornår udløseren udløses, såsom
FØR
,EFTER
, ellerI STEDET FOR
. Du kan opretteBEFORE
ogEFTER
udløsere på et bord. Du kan dog kun oprette enI STEDET FOR
trigger på en visning. - Angiv derefter den hændelse, der får triggeren til at blive påkaldt, såsom
INSERT
,OPDATERING
ellerSLET
. - Derefter skal du angive den tabel, som udløseren tilhører.
- Placer til sidst triggerlogikken i
BEGIN END
blok, som kan være alle gyldige SQL-sætninger.
Hvis du kombinerer det tidspunkt, hvor udløseren udløses, og den hændelse, der får udløseren til at blive udløst, har du i alt 9 muligheder:
FØR INDSÆT
EFTER INDSÆTNING
FØR OPDATERING
EFTER OPDATERING
FØR SLETT
EFTER SLETNING
I STEDET FOR INDSÆT
I STEDET FOR SLET
I STEDET FOR OPDATERING
Antag, at du bruger en OPDATERING sætning for at opdatere 10 rækker i en tabel, udløses triggeren, der er knyttet til tabellen, 10 gange. Denne trigger kaldes
FOR HVER RÆKKE
udløser. Hvis triggeren, der er knyttet til tabellen, udløses én gang, kalder vi denne trigger en FOR HVER UDTALELSE
trigger.
Fra version 3.9.2 understøtter SQLite kun FOR HVER RÆKKE
udløser. Den har endnu ikke understøttet FOR EACH STATEMENT
udløser.
Hvis du bruger en betingelse i HVORNÅR
klausul, aktiveres udløseren kun, når betingelsen er sand. Hvis du udelader HVORNÅR
klausul, udføres triggeren for alle rækker.
Bemærk, at hvis du dropper en tabel, slettes alle tilknyttede triggere også. Men hvis triggeren refererer til andre tabeller, fjernes triggeren ikke eller ændres, hvis andre tabeller fjernes eller opdateres.
For eksempel refererer en trigger til en tabel med navnet people
, dropper du personerne
tabel eller omdøbe den, skal du manuelt ændre definitionen af triggeren.
Du kan få adgang til dataene for rækken, der indsættes, slettes eller opdateres ved hjælp af OLD
og NY
referencer i formen:OLD.column_name
og NEW.column_name
.
den GAMMEL
og NY
referencer er tilgængelige afhængigt af den hændelse, der forårsager, at triggeren udløses.
Følgende tabel illustrerer reglerne.:
Handling | Reference |
---|---|
INDSÆT | NYT er tilgængeligt |
OPDATERING | Både NYE og GAMLE er tilgængelige |
SLET | GAMMEL er tilgængelig |
SQLite udløser eksempler
Lad os oprette en ny tabel kaldet kundeemner for at gemme alle virksomhedens kundeemner.
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 FØR INDSÆT
trigger eksempel
Antag, at du vil validere e-mailadressen, før du indsætter et nyt kundeemne i leads
bord. I dette tilfælde kan du bruge en BEFORE INSERT
trigger.
Først skal du oprette en BEFORE INSERT
trigger som følger:
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 brugte NEW
reference for at få adgang til e-mail-kolonnen i den række, der indsættes.
For at validere e-mailen brugte vi LIKE
operatør for at afgøre, om e-mailen er gyldig eller ej baseret på e-mail-mønsteret. Hvis e-mailen ikke er gyldig, vises RAISE
funktionen afbryder indsættelsen og afgiver en fejlmeddelelse.
For det andet skal du indsætte en række med en ugyldig e-mail i leads
tabel.
INSERT INTO leads (first_name,last_name,email,phone)
VALUES('John','Doe','jjj','4089009334');
Code language: SQL (Structured Query Language) (sql)
SQLite udsendte en fejl:"Ugyldig e-mailadresse" og afbrød udførelsen af indsættelsen.
For det tredje, indsæt en række med en gyldig e-mail.
INSERT INTO leads (first_name, last_name, email, phone)
VALUES ('John', 'Doe', '[email protected]', '4089009334');
Code language: SQL (Structured Query Language) (sql)
Fordi e-mailen er gyldig, blev insert-sætningen udført.
SELECT
first_name,
last_name,
email,
phone
FROM
leads;
Code language: SQL (Structured Query Language) (sql)
2) SQLite EFTER OPDATERING
trigger eksempel
Leadernes telefoner og e-mails er så vigtige, at du ikke har råd til at miste disse oplysninger. For eksempel kan nogen ved et uheld opdatere e-mailen eller telefonen til de forkerte eller endda slette den.
For at beskytte disse værdifulde data bruger du en trigger til at logge alle ændringer, der er foretaget på telefonen og e-mailen.
Først skal du oprette en ny tabel kaldet lead_logs
for at gemme de historiske 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)
For det andet skal du oprette en EFTER OPDATERING
trigger for at logge data til lead_logs
tabel, når der er en opdatering i e-mail
eller telefon
kolonne.
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 bemærker det i tilstanden i HVORNÅR
klausul specificerer, at udløseren kun aktiveres, når der er en ændring i enten e-mail- eller telefonkolonnen.
For det tredje skal du opdatere efternavnet på John
fra Doe
til Smith
.
UPDATE leads
SET
last_name = 'Smith'
WHERE
id = 1;
Code language: SQL (Structured Query Language) (sql)
Udløseren log_contact_after_update
blev ikke påberåbt, fordi der ikke var nogen ændring i e-mail eller telefon.
For det fjerde skal du opdatere både e-mail og telefon for John
til de nye.
UPDATE leads
SET
phone = '4089998888',
email = '[email protected]'
WHERE
id = 1;
Code language: SQL (Structured Query Language) (sql)
Hvis du tjekker logtabellen, vil du se, at der er en ny post der.
SELECT
old_phone,
new_phone,
old_email,
new_email,
user_action
FROM
lead_logs;
Code language: SQL (Structured Query Language) (sql)
Du kan udvikle EFTER INSERT
og EFTER SLETT
triggere til at logge dataene i lead_logs
bord som en øvelse.
SQLite DROP TRIGGER
erklæring
For at slippe en eksisterende trigger, bruger du DROP TRIGGER
erklæring som følger:
DROP TRIGGER [IF EXISTS] trigger_name;
Code language: SQL (Structured Query Language) (sql)
I denne syntaks:
- Først skal du angive navnet på den trigger, som du vil slippe efter
DROP TRIGGER
søgeord. - For det andet skal du bruge koden
HVIS FINDER
mulighed for kun at slette triggeren, hvis den findes.
Bemærk, at hvis du dropper en tabel, vil SQLite automatisk droppe alle triggere, der er knyttet til tabellen.
For eksempel for at fjerne validate_email_before_insert_leads
trigger, bruger du følgende sætning:
DROP TRIGGER validate_email_before_insert_leads;
Code language: SQL (Structured Query Language) (sql)
I denne vejledning har vi introduceret dig til SQLite-triggere og viser dig, hvordan du opretter og dropper triggere fra databasen.