English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Trigger di SQLite (Trigger)

I trigger di SQLite sono funzioni di callback del database, che vengono eseguite/invocate automaticamente quando si verificano eventi specifici del database. Ecco alcuni punti chiave sui trigger di SQLite-

  • I trigger (Trigger) di SQLite possono essere specificati per attivarsi quando si verificano DELETE, INSERT o UPDATE su un database tabella specifico, o quando si verifica un aggiornamento su una o più colonne specifiche delle tabelle.

  • SQLite supporta solo trigger (Trigger) FOR EACH ROW, senza trigger (Trigger) FOR EACH STATEMENT. Pertanto, specificare chiaramente FOR EACH ROW è opzionale.

  • Quando la clausola WHEN e l'azione del trigger (Trigger) possono accedere all'uso delle forme NEW.column-name e OLD.column-name L'elemento di riga di riferimento inserito, eliminato o aggiornato, dove column-name è il nome della colonna della tabella associata al trigger.

  • Se viene fornita la clausola WHEN, vengono eseguite le istruzioni SQL solo per le righe per cui WHEN è vero. Se non viene fornita la clausola WHEN, vengono eseguite le istruzioni SQL per tutte le righe.

  • Le parole chiave BEFORE o AFTER determinano quando eseguire l'azione del trigger, decidendosi se eseguire l'azione del trigger prima o dopo l'inserimento, la modifica o l'eliminazione della riga associata.

  • Quando viene eliminata la tabella associata al trigger, viene automaticamente eliminato il trigger (Trigger).

  • La tabella da modificare deve esistere nella stessa banca dati, come tabella o vista alla quale è collegato il trigger, e deve utilizzare solo tablenameinvece di database.tablename.

  • Una funzione SQL speciale RAISE() può essere utilizzata per lanciare eccezioni all'interno del programma del trigger.

Sintassi

Ecco la sintassi di base per creare un trigger.

CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- Logica del trigger...
END;

quievent_namepossono essere su una delle seguenti tabelleINSERT, DELETEeUPDATEOperazioni sul databasetable_namePuoi specificare FOR EACH ROW dopo il nome della tabella.

Ecco la sintassi per creare un trigger su un'operazione di aggiornamento di una o più colonne nella tabella.

CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name 
ON table_name
BEGIN
   -- Logica del trigger qui...
END;

Esempio

Consideriamo un caso in cui vogliamo effettuare un test di audit su ogni record inserito nella tabella COMPANY, che abbiamo appena creato come segue (se esiste già, eliminare la tabella COMPANY).

sqlite> CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

Per mantenere lo stato di prova dell'audit, ogni volta che c'è una nuova voce di record nella tabella COMPANY, creeremo una nuova tabella chiamata AUDIT nella quale inseriremo i messaggi di log.

sqlite> CREATE TABLE AUDIT(
   EMP_ID INT NOT NULL,
   ENTRY_DATE TEXT NOT NULL
);

In questo caso, ID è l'ID del record AUDIT, EMP_ID è l'ID proveniente dalla tabella COMPANY, DATE conserverà il timestamp quando verrà creato il record nella tabella COMPANY. Ora creiamo un trigger sulla tabella COMPANY, come indicato di seguito:

sqlite> CREATE TRIGGER audit_log AFTER INSERT 
ON COMPANY
BEGIN
   INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
END;

Ora, inizieremo il lavoro pratico, iniziamo ad inserire record nella tabella COMPANY, il che causerà la creazione di record di log di revisione nella tabella AUDIT. Crea un record nella tabella COMPANY, come indicato di seguito-

sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00);

Questo creerà un record nella tabella COMPANY, come indicato di seguito-

ID                                 NAME                             AGE                                 ADDRESS                 SALARY
----------                         ----------                         ----------                         ----------
1                                 Paul                         32                                 California         20000.0

Allo stesso tempo, verrà creato un record nella tabella AUDIT. Questo record è il risultato del trigger che abbiamo creato sull'operazione INSERT nella tabella COMPANY. Allo stesso modo, puoi creare trigger sulle operazioni UPDATE e DELETE secondo necessità.

EMP_ID                             ENTRY_DATE
----------                         -------------------
1                                 2013-04-05 06:26:00

elenca i trigger

Puoi otteneresqlite_masterElenca tutti i trigger nella tabella, come indicato di seguito:

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger';

L'istruzione SQLite sopra elencherà solo un voce, come indicato di seguito-

name
----------
audit_log

Se si desidera elencare i trigger su una tabella specifica, utilizzare la clausola AND e il nome della tabella, come indicato di seguito:

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'COMPANY';

La seguente frase SQLite elencherà solo un entry, come segue-

name
----------
audit_log

Eliminazione del Trigger

Di seguito è riportato il comando DROP, utilizzabile per eliminare trigger esistenti.

sqlite> DROP TRIGGER trigger_name;