Comment gérer une fonctionnalité manquante de SQLite: Je n'ai pas stocké le nom des déclencheurs pour une table spécifique. p>
Par exemple, comment puis-je laisser tomber tous les déclencheurs? Désactiver les déclencheurs code>? p>
Que feriez-vous? P>
7 Réponses :
Peut-être que vous pouvez faire une procédure stockée pour les déposer et les créer. Est-ce bon pour vous? P>
Je n'ai pas stocké le nom des déclencheurs. J'ai donc besoin d'obtenir tous les déclencheurs spécifiques pour une table.
Schéma SQLite Schema (Meta) Information dans l'intégré Pour obtenir une liste des déclencheurs disponibles Utilisez la requête ci-dessous: P> SQLITE_MASTER CODE> TABLE.
SELECT name FROM sqlite_master
WHERE type = 'trigger' -- AND tbl_name = 'a_table_name'
J'ai écrit une fonction d'extension très simple pour définir une valeur booléenne sur true ou false.
et une fonction pour récupérer cette valeur (getallriggerson ()). p>
avec cette fonction je peux définir tout mes déclencheurs comme: p>
Comment avez-vous créé une fonction dans SQLite?
Je suis content que vous ayez écrit une extension. Soins à partager avec la classe?
Voici donc ici 2015 et il n'est toujours pas «désactiver des déclencheurs» dans SQLite. Pour une application mobile, cela peut être problématique - surtout s'il s'agit d'une application d'entreprise nécessitant des fonctionnalités hors ligne et des données locales.
Une charge initiale de données peut être ralentie pour ramper par l'exécution de la gâchette, même lorsque vous n'enverrez pas chaque insert dans une transaction individuelle. P>
J'ai résolu ce problème à l'aide de SQLite SQL Assez. J'ai une table de paramètres qui ne participe pas à la charge initiale. Il contient des «liste» des paires de clés / de valeur. J'ai une touche appelée "Firetrigger" avec une valeur bit de 0 ou 1. Chaque déclencheur que j'ai a une expression qui sélectionne la valeur et si elle est égale à 1, il tire la gâchette, sinon elle ne le fait pas. P>
Cette expression est en plus des expressions évaluées sur les données relatives à la gâchette. Par exemple: p> en simple effet propre, cela me permet de désactiver / activer la gâchette avec une simple mise à jour code> à la table des paramètres p> < / p>
Élargir sur la réponse de Nick Dandoulakis, vous pouvez supprimer tous les déclencheurs pertinents, puis les réinstaller avant la fin de la transaction:
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;
Élargir d'autres réponses C'est comme ça que je le fais. Prenez en compte que cela désactive tous les déclencheurs pour toutes les tables de la base de données, à l'exception de certaines des utilisées par spatialite code>
Définissez un drapeau dans votre base de données et utilisez-le dans les déclencheurs lors de la condition.
Dites que vous souhaitez créer une gâchette sur la table "Clients" après un insert. Vous avez créé une table "Trigger_Settings" avec un champ Tinyint "Triggers_on" - c'est votre drapeau. Ensuite, vous pouvez définir le champ sur 0 si vous souhaitez désactiver les filtres et sur 1 lorsque vous souhaitez les éteindre. P>
Ensuite, vous créez votre filtre avec une condition qui vérifie le "Triggers_on" Champ. p>
Par exemple: P>
CREATE TRIGGER IF NOT EXISTS log_client_data_after_insert AFTER INSERT ON [clients] WHEN (SELECT triggers_on FROM trigger_settings)=1 BEGIN your_statement END;