在sqlite数据库中保存日志表?

时间:2009-01-08 01:51:53

标签: sql sqlite

我正在寻找一种方法来设置(通过SQL)一个日志表,其中包含对我的sqlite数据库所做的所有事情(最好是根据发布到数据库的insert,create table等语句)。我确信有办法通过在每个表上设置触发器来实现它,但这只是太多的工作,如果我稍后更改数据库的模式,那就不好了。是否存在一个对数据库起作用的全局事物(如数据库本身的触发器)?

我也愿意接受其他建议,以便记录对sqlite数据库所做的更改,以便我可以在几个月后回顾这些更改。

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

2 个答案:

答案 0 :(得分:7)

虽然以下内容不符合您的所有要求,但您可能希望看到一种方法。 Mike Chirico's SQLite Tutorial有一个关于记录所有插入,更新和删除的部分,它模仿了MySQL的binlog功能。

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

答案 1 :(得分: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*);