sql >> Database teknologi >  >> RDS >> SQLite

SQLite trigger

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 , eller I STEDET FOR . Du kan oprette BEFORE og EFTER udløsere på et bord. Du kan dog kun oprette en I STEDET FOR trigger på en visning.
  • Angiv derefter den hændelse, der får triggeren til at blive påkaldt, såsom INSERT , OPDATERING eller SLET .
  • 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.


  1. Problemer med indholdstyper ved indlæsning af en armatur i Django

  2. Forbinder SQL Server til PostgreSQL

  3. Er der en Profiler-ækvivalent til MySql?

  4. Tips til migrering fra MySQL-replikering til MySQL Galera Cluster 4.0