2010-02-12 8 views

Antwort

7

Ich habe eine sehr einfache Erweiterung Funktion einen Booleschen Wert auf true oder false gesetzt schrieb.

Und eine Funktion, um diesen Wert (GetAllTriggersOn()) abzurufen.

Mit dieser Funktion ich alle meine Trigger wie definieren:

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

Wie haben Sie eine Funktion in SQLite erstellt? – Ivan

1

Vielleicht können Sie eine gespeicherte Prozeduren für das Löschen und Erstellen erstellen. Ist das gut für Sie ?

+0

Ich habe den Namen der Trigger nicht gespeichert. Also muss ich alle Auslöser für eine Tabelle erhalten. – Pentium10

6

SQLite speichert Schema (Meta) Informationen in der integrierten sqlite_master Tabelle.

Um eine Liste des verfügbaren Trigger verwenden, um die folgende Abfrage zu erhalten:

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

es also hier 2015 und es gibt noch keine ‚disable Trigger‘ in SQLite. Für eine mobile Anwendung kann dies problematisch sein - insbesondere, wenn es sich um eine Unternehmens-App handelt, die Offline-Funktionalität und lokale Daten erfordert.

Eine anfängliche Datenladung kann verlangsamt werden, um durch Ausführung von Triggern zu crawlen, auch wenn Sie nicht jede Einfügung in eine einzelne Transaktion umbrechen.

Ich löste dieses Problem mit SQLite SQL ziemlich einfach. Ich habe eine Einstellungstabelle, die nicht an der Init-Last teilnimmt. Es enthält eine Liste von Schlüssel/Wert-Paaren. Ich habe einen Schlüssel namens "fireTrigger" mit einem Bit-Wert von 0 oder 1. Jeder Trigger, den ich habe, hat einen Ausdruck, der den Wert auswählt und wenn er gleich 1 ist, löst er den Trigger aus, sonst nicht.

Dieser Ausdruck wird zusätzlich zu allen Ausdrücken verwendet, die für die Daten ausgewertet werden, die sich auf den Trigger beziehen. zB:

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

In einfachen Clean-Effekt dies ermöglicht es mir, den Trigger mit einer einfachen UPDATE an den Einstellungen Tabelle

0

Erweiterung auf Nick Dandoulakis Antwort auf deaktivieren/aktivieren, können Sie alle relevanten Trigger fallen und sie dann wieder einstellen vor dem Abschluss der Transaktion:

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; 
Verwandte Themen