2010-02-12 9 views

risposta

7

Ho scritto una semplice funzione di estensione per impostare un valore booleano true o false.

E una funzione per recuperare questo valore (GetAllTriggersOn()).

Con questa funzione posso definire tutti i miei trigger come:

CREATE TRIGGER tr_table1_update AFTER UPDATE ON TABLE1 WHEN GetAllTriggersOn() 
BEGIN 
    -- ... 
END 
+0

Come hai creato una funzione in SQLite? – Ivan

1

Forse è possibile eseguire stored procedure per l'eliminazione e la creazione. Ti va bene?

+0

Non ho memorizzato il nome dei trigger. Quindi ho bisogno di ottenere tutti i trigger specifici per un tavolo. – Pentium10

6

SQLite memorizza le informazioni sullo schema (meta) nella tabella sqlite_master integrata.

per ottenere un elenco di trigger disponibili utilizzare la query di seguito:

SELECT name FROM sqlite_master 
WHERE type = 'trigger' -- AND tbl_name = 'a_table_name' 
3

Così qui è il 2015 e non c'è ancora 'trigger disabilita' in SQLite. Per un'applicazione mobile questo può essere problematico, specialmente se si tratta di un'applicazione aziendale che richiede funzionalità offline e dati locali.

Un caricamento dati iniziale può essere rallentato per la ricerca per indicizzazione mediante l'esecuzione del trigger anche quando non si esegue il wrapping di ogni inserto in una singola transazione.

Ho risolto questo problema utilizzando SQLite SQL in modo piuttosto semplice. Ho una tabella delle impostazioni che non partecipa al caricamento di init. Contiene "lista" di coppie chiave/valore. Ho una chiave chiamata 'fireTrigger' con un valore di bit di 0 o 1. Ogni trigger che ho ha un'espressione che seleziona il valore e se è uguale a 1 fa scattare il trigger, altrimenti non lo fa.

Questa espressione è in aggiunta a qualsiasi espressione valutata sui dati relativi al trigger. ad esempio:

AND 1 = (SELECT val FROM MTSSettings WHERE key = 'fireTrigger') 

In semplice effetto pulito questo mi permette di abilitare/disabilitare il grilletto con un semplice UPDATE alla tabella delle impostazioni

0

Ampliando la risposta di Nick Dandoulakis, potrebbe cadere tutti i trigger rilevanti e poi li reintegro prima del completamento della transazione:

BEGIN; 
SELECT name, sql FROM sqlite_master WHERE type = 'trigger' AND tbl_name = 'mytable'; 
-- store all results 
-- for each name: DROP TRIGGER $name; 
-- do normal work 
-- for each sql: execute the SQL verbatim 
COMMIT; 
Problemi correlati