2009-01-08 21 views
9

Estoy buscando una manera de configurar (a través de SQL) una tabla de registro que contenga todo lo que se ha hecho en mi base de datos sqlite (preferiblemente en términos de las instrucciones de inserción, creación de tabla, etc.). Estoy seguro de que hay una forma de hacerlo mediante el establecimiento de activadores en cada tabla, pero eso es MUY CAMINO demasiado trabajo y no augura nada bueno si cambio el esquema de la base de datos más adelante. ¿Hay algo global que funcione en la base de datos (como el desencadenador en la base de datos en sí)?manteniendo una tabla de registro en la base de datos sqlite?

También estoy abierto para otras sugerencias para mantener registros de los cambios realizados a la base de datos sqlite para que pueda mirar hacia atrás meses después en los cambios.

(Desde un punto de vista lógico hay formas, pero no puedo estar seguro de que mi programa sea el único programa que escribe en la base de datos).

+1

Si hubo un disparador en la base de datos, ¿no se dispararía? – recursive

Respuesta

0

estas funciones puede ser útil

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

que parecen actuar sobre DBS individuales

la única manera mundial que puedo ver es utilizar

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

Las funciones parecen funcionar solo cuando alguien que escribe en la base de datos usando su API explícitamente se conecta, pero estoy buscando formas que también dejen un registro cuando alguien (potencialmente no mi programa) escribe en la base de datos. – polyglot

7

Aunque la siguiente no se cumple con todos sus requisitos, es posible que desee ver una forma de hacerlo. Mike Chirico's SQLite Tutorial tiene una sección en Registrando todas las inserciones, actualizaciones y eliminaciones que imita la funcionalidad del binlog de MySQL.

Se basa en desencadenadores que deben coincidir con el esquema de cada tabla cuyos cambios desea realizar un seguimiento. Es decir, si su tabla tiene un campo llamado "a", entonces la tabla de registro debe realizar un seguimiento de "aOLD" y "aNEW". De esta forma, el activador puede registrar actualizaciones, inserciones y eliminaciones realizadas en los campos de esa tabla en particular.

+0

Nunca utilicé SQL Lite pero podría recuperar el esquema y luego podría hacer una secuencia de comandos que actualice sus triggers y tablas de historial. –

Cuestiones relacionadas