2009-01-08 96 views
9

我正在寻找一种方法来设置(通过SQL)一个日志表,其中包含对sqlite数据库所做的所有操作(最好根据发布到数据库的插入,创建表等语句)。我确定有办法通过在每个表上设置触发器来完成它,但这只是太多的工作,并且如果稍后更改数据库的模式,这并不是一个好兆头。在数据库中是否有全局的全局事物(比如触发数据库本身)?在sqlite数据库中保留一个日志表?

我也打开其他建议,保持对sqlite数据库所做的更改的记录,以便我可以回顾几个月后的变化。

(编程方式当然有办法,但我不能确定我的程序是写入数据库的唯一程序)。

+1

如果数据库中有触发器,它会不会自动启动? – recursive 2009-01-08 02:28:56

回答

0

这些功能可能是有用的

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

他们似乎作用于个体DBS

全球唯一的办法,我可以看到的是使用

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

这些函数似乎只有在使用api写入数据库的人明确地挂钩时才起作用,但我正在寻找一种方法,当有人(可能不是我的程序)写入数据库时​​也会留下记录。 – polyglot 2009-01-08 21:04:33

7

尽管以下不满足你的所有要求,你可能希望看到一种方法来做到这一点。 Mike Chirico's SQLite Tutorial上有一个部分,记录所有插入,更新和删除,它们模仿MySQL的二进制日志的功能。

它依赖于触发器,它必须与您希望跟踪其更改的每个表的模式相匹配。也就是说,如果你的表有一个名为“a”的字段,那么记录表需要跟踪“aOLD”和“aNEW”。通过这种方式,触发器可以记录更新,插入和删除特定表中的字段。

+0

我从来没有使用过SQL Lite,但是你可以检索模式,然后你可以创建一个更新触发器和历史表的脚本。 – 2009-01-30 09:08:37