2009-01-08 8 views
9

Je cherche un moyen de configurer (via SQL) une table de journal contenant tout ce qui a été fait à ma base de données sqlite (de préférence en termes d'instructions insert, create table etc ...). Je suis sûr qu'il y a moyen de le faire en définissant un trigger sur chaque table, mais c'est juste trop de travail et ça ne va pas bien si je change le schéma de la base de données plus tard. Y a-t-il un truc global qui fonctionne sur la base de données (comme le déclencheur sur la base de données elle-même)?conserver une table de journal dans la base de données sqlite?

Je suis également ouvert à d'autres suggestions pour conserver les enregistrements des modifications apportées à la base de données sqlite afin que je puisse regarder des mois plus tard sur les changements.

(Bien sûr, il existe bien sûr des moyens, mais je ne peux pas être sûr que mon programme est le seul programme qui écrit dans la base de données).

+1

S'il y avait un déclencheur sur la base de données, ne se déclencherait-il pas? – recursive

Répondre

0

ces fonctions peut être utile

void *sqlite3_update_hook(
    sqlite3*, 
    void(*)(void *,int ,char const *,char const *,sqlite3_int64), 
    void* 
); 

void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); 

void *sqlite3_profile(
    sqlite3*, 
    void(*xProfile)(void*,const char*,sqlite3_uint64), void* 
); 

ils semblent agir sur dbs individuels

la seule façon globale, je peux voir est d'utiliser

sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); 
int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); 
int sqlite3_vfs_unregister(sqlite3_vfs*); 
+0

Les fonctions semblent fonctionner uniquement lorsque quelqu'un qui écrit dans la base de données à l'aide de leur api se connecte explicitement, mais je cherche des façons de laisser un enregistrement quand quelqu'un (potentiellement pas mon programme) écrit dans la base de données. – polyglot

7

Bien que le fait de suivre pas répondre à toutes vos exigences, vous pouvez voir une façon de le faire. Mike Chirico's SQLite Tutorial a une section sur Connexion toutes les insertions, mises à jour et suppressions qui imite la fonctionnalité de binlog de MySQL.

Elle repose sur des déclencheurs qui doivent correspondre au schéma de chaque table dont vous souhaitez suivre les modifications. C'est-à-dire que si votre table a un champ appelé "a", la table de journalisation doit garder une trace de "aOLD" et "aNEW". De cette manière, le déclencheur est capable d'enregistrer les mises à jour, les insertions et les suppressions apportées aux champs de cette table particulière.

+0

Je n'ai jamais utilisé SQL Lite mais vous devriez pouvoir récupérer le schéma et ensuite vous pouvez créer un script qui met à jour vos triggers et vos tables d'historique. –

Questions connexes