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 TRIGGERsøgeord. - Nu skal du bestemme, hvornår udløseren udløses, såsom
FØR,EFTER, ellerI STEDET FOR. Du kan opretteBEFOREogEFTERudløsere på et bord. Du kan dog kun oprette enI STEDET FORtrigger på en visning. - Angiv derefter den hændelse, der får triggeren til at blive påkaldt, såsom
INSERT,OPDATERINGellerSLET. - Derefter skal du angive den tabel, som udløseren tilhører.
- Placer til sidst triggerlogikken i
BEGIN ENDblok, 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ÆTEFTER INDSÆTNINGFØR OPDATERINGEFTER OPDATERINGFØR SLETTEFTER SLETNINGI STEDET FOR INDSÆTI STEDET FOR SLETI 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', 'john.doe@sqlitetutorial.net', '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 = 'john.smith@sqlitetutorial.net'
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 TRIGGERsøgeord. - For det andet skal du bruge koden
HVIS FINDERmulighed 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.