English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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;
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
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
Di seguito è riportato il comando DROP, utilizzabile per eliminare trigger esistenti.
sqlite> DROP TRIGGER trigger_name;