2009-01-08 10 views
9

Ich suche nach einer Möglichkeit, (über SQL) eine Protokolltabelle einzurichten, die alles enthält, was mit meiner sqlite-Datenbank gemacht wurde (vorzugsweise in Bezug auf die Anweisungen insert, create table usw., wie sie an die Datenbank ausgegeben werden). Ich bin mir sicher, dass es einen Weg gibt, den Trigger für jede Tabelle zu setzen, aber das ist einfach zu viel Arbeit und verheißt nichts Gutes, wenn ich später das Schema der Datenbank ändere. Gibt es eine allgemeine globale Sache, die auf der Datenbank funktioniert (wie Trigger für die Datenbank selbst)?eine Protokolltabelle in SQLite-Datenbank zu halten?

Ich bin auch offen für andere Vorschläge für Aufzeichnungen über Änderungen in SQLite-Datenbank, so dass ich Monate später auf die Änderungen zurückblicken kann.

(Programmatisch natürlich gibt es Möglichkeiten, aber ich kann nicht sicher sein, dass mein Programm das einzige Programm ist, das in die Datenbank schreibt).

+1

Wenn es einen Trigger für die Datenbank gab, würde sie sich nicht selbst auslösen? – recursive

Antwort

0

können diese Funktion

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* 
); 

sie scheinen zu wirken auf einzelne dbs

die einzige globale Weise, die ich sehen kann, ist die Verwendung

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

Die Funktionen scheinen nur zu funktionieren, wenn jemand, der mit ihrer API in die Datenbank schreibt, explizit einruft, aber ich suche nach Wegen, die auch einen Datensatz hinterlassen, wenn jemand (möglicherweise nicht mein Programm) in die Datenbank schreibt. – polyglot

7

Obwohl die folgenden nicht sinnvoll sein, erfüllen Sie alle Ihre Anforderungen, möchten Sie möglicherweise einen Weg sehen, es zu tun. Mike Chirico's SQLite Tutorial hat einen Abschnitt auf Alle Inserts, Updates und Löscht Protokollierung, die die Funktionalität von MySQL binlog imitiert.

Es beruht auf Triggern, die mit dem Schema für jede Tabelle übereinstimmen müssen, deren Änderungen Sie verfolgen möchten. Das heißt, wenn Ihre Tabelle ein Feld namens "a" hat, dann muss die Logging-Tabelle "aOLD" und "aNEW" verfolgen. Auf diese Weise kann der Auslöser Aktualisierungen, Einfügungen und Löschungen aufzeichnen, die an den Feldern in dieser bestimmten Tabelle vorgenommen wurden.

+0

Ich habe noch nie SQL Lite verwendet, aber Sie können das Schema reaktivieren und dann ein Skript erstellen, das Ihre Auslöser und Verlaufstabellen aktualisiert. –

Verwandte Themen