sql >> Databáze >  >> RDS >> SQLite

Spouštěč SQLite

Shrnutí :tento tutoriál pojednává o spouštění SQLite, což je databázový objekt spouštěný automaticky při změně dat v tabulce.

Co je spouštěč SQLite

Spouštěč SQLite je pojmenovaný databázový objekt, který se automaticky spustí při INSERT , UPDATE nebo DELETE je vydán příkaz k příslušné tabulce.

Kdy potřebujeme spouštěče SQLite

Spouštěče často používáte k aktivaci sofistikovaného auditování. Chcete například zaznamenat změny v citlivých datech, jako je plat a adresa, kdykoli se změní.

Kromě toho používáte spouštěče k vynucení složitých obchodních pravidel centrálně na úrovni databáze a zabránění neplatným transakcím.

SQLite CREATE TRIGGER prohlášení

Chcete-li vytvořit nový spouštěč v SQLite, použijte CREATE TRIGGER prohlášení takto:

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)

V této syntaxi:

  • Nejprve zadejte název spouštěče za CREATE TRIGGER klíčová slova.
  • Dále určete, kdy je spouštěč spuštěn, například BEFORE , AFTER , nebo INSTEAD OF . Můžete vytvořit BEFORE a AFTER spouště na stole. Můžete však vytvořit pouze INSTEAD OF spustit při pohledu.
  • Poté zadejte událost, která způsobí vyvolání spouštěče, například INSERT , UPDATE nebo DELETE .
  • Poté označte tabulku, do které spouštěč patří.
  • Nakonec umístěte spouštěcí logiku do BEGIN END blok, což mohou být libovolné platné příkazy SQL.

Pokud zkombinujete čas, kdy je trigger aktivován, a událost, která způsobí jeho spuštění, máte celkem 9 možností:

  • BEFORE INSERT
  • AFTER INSERT
  • BEFORE UPDATE
  • AFTER UPDATE
  • BEFORE DELETE
  • AFTER DELETE
  • INSTEAD OF INSERT
  • INSTEAD OF DELETE
  • INSTEAD OF UPDATE

Předpokládejme, že používáte UPDATE Chcete-li aktualizovat 10 řádků v tabulce, spouštěč přidružený k tabulce se spustí 10krát. Toto pravidlo se nazývá FOR EACH ROW spoušť. Pokud je spouštěč přidružený k tabulce aktivován jednou, nazýváme jej FOR EACH STATEMENT spoušť.

Od verze 3.9.2 SQLite podporuje pouze FOR EACH ROW spouštěče. Dosud nepodporuje FOR EACH STATEMENT spouští.

Pokud použijete podmínku v WHEN klauzule, je spouštěč vyvolán pouze tehdy, když je podmínka pravdivá. V případě, že vynecháte WHEN klauzule, trigger se provede pro všechny řádky.

Všimněte si, že pokud pustíte tabulku, odstraní se také všechny související spouštěče. Pokud však spouštěč odkazuje na jiné tabulky, spouštěč se neodstraní ani nezmění, pokud jsou odstraněny nebo aktualizovány jiné tabulky.

Například spouštěč odkazuje na tabulku s názvem people , vypustíte people tabulku nebo ji přejmenovat, musíte ručně změnit definici spouštěče.

K datům řádku, který se vkládá, odstraňuje nebo aktualizuje, můžete přistupovat pomocí OLD a NEW odkazy ve tvaru:OLD.column_name a NEW.column_name .

OLD a NEW odkazy jsou dostupné v závislosti na události, která způsobí spuštění spouštěče.

Následující tabulka ilustruje pravidla.:

Akce Reference
INSERT NOVÉ je k dispozici
AKTUALIZACE K dispozici jsou NOVÉ i STARÉ
SMAZAT OLD je k dispozici

Příklady spouštění SQLite

Vytvořme novou tabulku nazvanou potenciální zákazníci, abychom uložili všechny obchodní potenciální zákazníky společnosti.

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 příklad spouště

Předpokládejme, že chcete ověřit e-mailovou adresu před vložením nového potenciálního zákazníka do leads stůl. V tomto případě můžete použít BEFORE INSERT spoušť.

Nejprve vytvořte BEFORE INSERT spusťte následovně:

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)

Použili jsme NEW odkaz pro přístup ke sloupci e-mailu v řádku, který se vkládá.

K ověření e-mailu jsme použili LIKE operátora, který na základě vzoru e-mailu určí, zda je e-mail platný či nikoli. Pokud e-mail není platný, RAISE funkce přeruší vkládání a vydá chybovou zprávu.

Za druhé, vložte řádek s neplatným e-mailem do leads tabulka.

INSERT INTO leads (first_name,last_name,email,phone)
VALUES('John','Doe','jjj','4089009334');Code language: SQL (Structured Query Language) (sql)

SQLite vydalo chybu:„Neplatná e-mailová adresa“ a přerušilo provádění vložení.

Za třetí vložte řádek s platným e-mailem.

INSERT INTO leads (first_name, last_name, email, phone)
VALUES ('John', 'Doe', '[email protected]', '4089009334');Code language: SQL (Structured Query Language) (sql)

Protože je e-mail platný, příkaz vložení byl úspěšně proveden.

SELECT
	first_name,
	last_name,
	email,
	phone
FROM
	leads;Code language: SQL (Structured Query Language) (sql)

2) SQLite AFTER UPDATE příklad spouště

Telefony a e-maily potenciálních zákazníků jsou tak důležité, že si nemůžete dovolit tyto informace ztratit. Někdo například omylem aktualizuje e-mail nebo telefon na nesprávné nebo je dokonce smaže.

Chcete-li tato cenná data chránit, pomocí spouštěče zaznamenáte všechny změny provedené v telefonu a e-mailu.

Nejprve vytvořte novou tabulku s názvem lead_logs pro uložení historických dat.

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)

Zadruhé vytvořte AFTER UPDATE spouštěče pro protokolování dat do lead_logs tabulky vždy, když je v email aktualizace nebo phone sloupec.

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)

Všimnete si, že ve stavu v WHEN klauzule určuje, že spouštěč je vyvolán pouze tehdy, když dojde ke změně buď ve sloupci e-mailu nebo telefonu.

Za třetí, aktualizujte příjmení John z Doe na Smith .

UPDATE leads
SET 
   last_name = 'Smith'
WHERE
   id = 1;Code language: SQL (Structured Query Language) (sql)

Spouštěč log_contact_after_update nebylo vyvoláno, protože nedošlo k žádné změně e-mailu ani telefonu.

Za čtvrté, aktualizujte e-mail a telefon John k novým.

UPDATE leads
SET 
   phone = '4089998888',
   email = '[email protected]'
WHERE
   id = 1;Code language: SQL (Structured Query Language) (sql)

Pokud zkontrolujete tabulku protokolů, uvidíte, že je tam nový záznam.

SELECT
   old_phone, 
   new_phone, 
   old_email, 
   new_email, 
   user_action
FROM
   lead_logs;Code language: SQL (Structured Query Language) (sql)

Můžete vytvořit AFTER INSERT a AFTER DELETE spustí protokolování dat do lead_logs stůl jako cvičení.

SQLite DROP TRIGGER prohlášení

Chcete-li zahodit existující spouštěč, použijte DROP TRIGGER prohlášení takto:

DROP TRIGGER [IF EXISTS] trigger_name;Code language: SQL (Structured Query Language) (sql)

V této syntaxi:

  • Nejprve zadejte název spouštěče, který chcete vypustit po DROP TRIGGER klíčová slova.
  • Zadruhé použijte IF EXISTS možnost odstranit spouštěč, pouze pokud existuje.

Všimněte si, že pokud zrušíte tabulku, SQLite automaticky zruší všechny spouštěče spojené s tabulkou.

Chcete-li například odstranit validate_email_before_insert_leads trigger, použijete následující příkaz:

DROP TRIGGER validate_email_before_insert_leads;Code language: SQL (Structured Query Language) (sql)

V tomto tutoriálu jsme vám představili spouštěče SQLite a ukázali vám, jak vytvářet spouštěče a rušit je z databáze.


  1. Oracle RAC na cloudech třetích stran

  2. dobrý postgresql klient pro Windows?

  3. Jak aktualizovat statistiky serveru SQL pro velké tabulky

  4. Výkon operátora MySQL IN na (velkém?) počtu hodnot