10
votes

Comment gérer une fonctionnalité manquante de SQLite: Désactiver les déclencheurs?

Comment gérer une fonctionnalité manquante de SQLite: Désactiver les déclencheurs ?

Je n'ai pas stocké le nom des déclencheurs pour une table spécifique.

Par exemple, comment puis-je laisser tomber tous les déclencheurs?
Que feriez-vous?


0 commentaires

7 Réponses :


1
votes

Peut-être que vous pouvez faire une procédure stockée pour les déposer et les créer. Est-ce bon pour vous?


1 commentaires

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.



7
votes

Schéma SQLite Schema (Meta) Information dans l'intégré SQLITE_MASTER CODE> TABLE.

Pour obtenir une liste des déclencheurs disponibles Utilisez la requête ci-dessous: P>

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


0 commentaires

7
votes

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 ()).

avec cette fonction je peux définir tout mes déclencheurs comme: xxx


2 commentaires

Comment avez-vous créé une fonction dans SQLite?


Je suis content que vous ayez écrit une extension. Soins à partager avec la classe?



7
votes

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.

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.

Cette expression est en plus des expressions évaluées sur les données relatives à la gâchette. Par exemple: xxx

en simple effet propre, cela me permet de désactiver / activer la gâchette avec une simple mise à jour à la table des paramètres < / p>


0 commentaires

0
votes

É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;


0 commentaires

1
votes

É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 xxx


0 commentaires

1
votes

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;


0 commentaires