sql >> Databasteknik >  >> RDS >> SQLite

SQLite trigger

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 , eller INSTEAD OF . Du kan skapa BEFORE och AFTER utlösare på ett bord. Du kan dock bara skapa en INSTEAD OF utlösare på en vy.
  • Ange sedan händelsen som gör att utlösaren anropas, såsom INSERT , UPDATE , eller DELETE .
  • 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.


  1. Hur beräknar jag tabellstorlek i Oracle

  2. Övervakning av PostgreSQL i en hybridmiljö

  3. 7 sätt att returnera dubbletter av rader som har en primärnyckel i MariaDB

  4. Oracle-fråga för att hitta alla förekomster av ett tecken i en sträng