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

Trigger SQLite

Riepilogo :questo tutorial tratta del trigger SQLite, che è un oggetto database attivato automaticamente quando i dati in una tabella vengono modificati.

Cos'è un trigger SQLite

Un trigger SQLite è un oggetto database denominato che viene eseguito automaticamente quando viene eseguito un INSERT , UPDATE o DELETE l'istruzione viene emessa contro la tabella associata.

Quando abbiamo bisogno di trigger SQLite

Utilizzi spesso i trigger per abilitare un controllo sofisticato. Ad esempio, vuoi registrare le modifiche nei dati sensibili come stipendio e indirizzo ogni volta che cambia.

Inoltre, utilizzi i trigger per applicare regole aziendali complesse a livello centrale a livello di database e prevenire transazioni non valide.

SQLite CREATE TRIGGER dichiarazione

Per creare un nuovo trigger in SQLite, usa CREATE TRIGGER dichiarazione come segue:

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)

In questa sintassi:

  • In primo luogo, specifica il nome dell'attivatore dopo CREATE TRIGGER parole chiave.
  • Quindi, determina quando viene attivato il trigger, ad esempio BEFORE , AFTER o INSTEAD OF . Puoi creare BEFORE e AFTER trigger su un tavolo. Tuttavia, puoi solo creare un INSTEAD OF attivare su una vista.
  • Quindi, specifica l'evento che causa l'invocazione del trigger, ad esempio INSERT , UPDATE o DELETE .
  • Dopodiché, indica la tabella a cui appartiene il trigger.
  • Infine, inserisci la logica di attivazione nel BEGIN END block, che può essere qualsiasi istruzione SQL valida.

Se combini il tempo in cui viene attivato il trigger e l'evento che provoca l'attivazione del trigger, hai un totale di 9 possibilità:

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

Supponiamo di utilizzare un UPDATE per aggiornare 10 righe in una tabella, il trigger associato alla tabella viene attivato 10 volte. Questo trigger è chiamato FOR EACH ROW grilletto. Se il trigger associato alla tabella viene attivato una volta, chiamiamo questo trigger un FOR EACH STATEMENT trigger.

A partire dalla versione 3.9.2, SQLite supporta solo FOR EACH ROW trigger. Non ha ancora supportato il FOR EACH STATEMENT trigger.

Se utilizzi una condizione in WHEN clausola, il trigger viene invocato solo quando la condizione è vera. Nel caso in cui ometti il ​​WHEN clausola, il trigger viene eseguito per tutte le righe.

Si noti che se si elimina una tabella, vengono eliminati anche tutti i trigger associati. Tuttavia, se il trigger fa riferimento ad altre tabelle, il trigger non viene rimosso o modificato se altre tabelle vengono rimosse o aggiornate.

Ad esempio, un trigger fa riferimento a una tabella denominata people , elimini le people tabella o rinominarla, è necessario modificare manualmente la definizione del trigger.

Puoi accedere ai dati della riga da inserire, eliminare o aggiornare utilizzando il OLD e NEW riferimenti nella forma:OLD.column_name e NEW.column_name .

il OLD e NEW i riferimenti sono disponibili a seconda dell'evento che causa l'attivazione del trigger.

La tabella seguente illustra le regole.:

Azione Riferimento
INSERIRE È disponibile il NUOVO
AGGIORNAMENTO Sono disponibili sia il NUOVO che il VECCHIO
ELIMINA È disponibile VECCHIO

Esempi di trigger SQLite

Creiamo una nuova tabella chiamata lead per archiviare tutti i lead aziendali dell'azienda.

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 esempio di attivazione

Si supponga di voler convalidare l'indirizzo email prima di inserire un nuovo lead nei leads tavolo. In questo caso, puoi utilizzare un BEFORE INSERT trigger.

Innanzitutto, crea un BEFORE INSERT attivare come segue:

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)

Abbiamo usato il NEW riferimento per accedere alla colonna email della riga che si sta inserendo.

Per convalidare l'e-mail, abbiamo utilizzato il LIKE operatore per determinare se l'e-mail è valida o meno in base al modello di e-mail. Se l'email non è valida, il RAISE la funzione interrompe l'inserimento ed emette un messaggio di errore.

In secondo luogo, inserisci una riga con un'email non valida nei leads tabella.

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

SQLite ha emesso un errore:"Indirizzo email non valido" e ha interrotto l'esecuzione dell'inserimento.

Terzo, inserisci una riga con un'e-mail valida.

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

Poiché l'e-mail è valida, l'istruzione insert è stata eseguita correttamente.

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

2) SQLite AFTER UPDATE esempio di attivazione

I telefoni e le e-mail dei lead sono così importanti che non puoi permetterti di perdere queste informazioni. Ad esempio, qualcuno aggiorna accidentalmente l'e-mail o il telefono con quelli sbagliati o addirittura lo elimina.

Per proteggere questi dati preziosi, utilizzi un trigger per registrare tutte le modifiche apportate al telefono e all'e-mail.

Per prima cosa, crea una nuova tabella chiamata lead_logs per memorizzare i dati storici.

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)

In secondo luogo, crea un AFTER UPDATE trigger per registrare i dati in lead_logs tabella ogni volta che c'è un aggiornamento nella email o phone colonna.

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)

Lo noti nella condizione in WHEN La clausola specifica che il trigger viene invocato solo quando si verifica una modifica nella colonna e-mail o telefono.

Terzo, aggiorna il cognome di John da Doe a Smith .

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

Il trigger log_contact_after_update non è stato richiamato perché non sono state apportate modifiche all'e-mail o al telefono.

In quarto luogo, aggiorna sia l'e-mail che il telefono di John ai nuovi.

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

Se controlli la tabella di registro, vedrai che c'è una nuova voce lì.

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

Puoi sviluppare il AFTER INSERT e AFTER DELETE attiva per registrare i dati in lead_logs tavola come esercizio.

SQLite DROP TRIGGER dichiarazione

Per eliminare un attivatore esistente, utilizza il DROP TRIGGER dichiarazione come segue:

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

In questa sintassi:

  • In primo luogo, specifica il nome del trigger che desideri rilasciare dopo il DROP TRIGGER parole chiave.
  • In secondo luogo, usa IF EXISTS opzione per eliminare il trigger solo se esiste.

Nota che se elimini una tabella, SQLite rilascerà automaticamente tutti i trigger associati alla tabella.

Ad esempio, per rimuovere validate_email_before_insert_leads trigger, utilizzi la seguente istruzione:

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

In questo tutorial, ti abbiamo presentato i trigger SQLite e ti abbiamo mostrato come creare e rilasciare trigger dal database.