【问题标题】:keeping a log table in sqlite database?在 sqlite 数据库中保留日志表?
【发布时间】:2010-09-30 04:37:38
【问题描述】:

我正在寻找一种方法来设置(通过 SQL)一个日志表,其中包含对我的 sqlite 数据库所做的所有操作(最好是在向数据库发出的插入、创建表等语句方面)。我确信有办法通过在每个表上设置触发器来做到这一点,但这只是工作量太大,如果我稍后更改数据库的架构,这不是好兆头。是否有适用于数据库的通用全局事物(例如数据库本身的触发器)?

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

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

【问题讨论】:

  • 如果数据库上有触发器,它不会自己触发吗?

标签: sql sqlite


【解决方案1】:

这些功能可能有用

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

它们似乎作用于单个数据库

我能看到的唯一全局方式是使用

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

【讨论】:

  • 这些功能似乎只有在使用他们的 api 写入数据库的人明确连接时才起作用,但我正在寻找在任何人(可能不是我的程序)写入时也留下记录的方法数据库。
【解决方案2】:

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

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

【讨论】:

  • 我从未使用过 SQL Lite,但您应该能够检索架构,然后您可以编写一个脚本来更新您的触发器和历史表。
猜你喜欢
  • 2021-04-13
  • 2016-10-27
  • 2012-05-10
  • 2021-12-31
  • 2015-04-11
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
相关资源
最近更新 更多