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
oINSTEAD OF
. Puoi creareBEFORE
eAFTER
trigger su un tavolo. Tuttavia, puoi solo creare unINSTEAD OF
attivare su una vista. - Quindi, specifica l'evento che causa l'invocazione del trigger, ad esempio
INSERT
,UPDATE
oDELETE
. - 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.