void *sqlite3_update_hook( sqlite3*, void(*)(void *,int ,char const *,char const *,sqlite3_int64), void* );
sqlite3_update_hook() 接口将回调函数注册到由第一个参数标识的 数据库连接,每当 rowid 表 中的某一行被更新、插入或删除时,该回调函数就会被调用。对于同一个数据库连接,之前对该函数的任何调用设置的回调函数都会被覆盖。
第二个参数是指向函数的指针,该函数在 rowid 表中的一行被更新、插入或删除时被调用。回调函数的第一个参数是 sqlite3_update_hook() 的第三个参数的副本。第二个回调参数是 SQLITE_INSERT、SQLITE_DELETE 或 SQLITE_UPDATE 之一,具体取决于触发回调调用的操作。回调函数的第三个和第四个参数包含指向包含受影响行的数据库和表名的指针。回调函数的最后一个参数是该行的 rowid。对于更新操作,这是更新后的 rowid。
当内部系统表被修改(例如 sqlite_sequence)时,不会调用更新钩子。当 WITHOUT ROWID 表被修改时,不会调用更新钩子。
在当前实现中,当由于 ON CONFLICT REPLACE 子句而删除冲突行时,不会调用更新钩子。当使用 truncate 优化 删除行时,也不会调用更新钩子。本段中定义的异常可能在 SQLite 的未来版本中发生变化。
更新钩子是在相应的更改之前还是之后被调用,目前尚无明确规定,并且可能因更改类型而异。不要依赖钩子调用相对于触发钩子的操作的最终结果的顺序。
更新钩子的实现不能执行任何会修改调用更新钩子的数据库连接的操作。任何修改数据库连接的操作必须推迟到触发更新钩子的 sqlite3_step() 调用完成之后。请注意,sqlite3_prepare_v2() 和 sqlite3_step() 都会修改它们自己的数据库连接,本段中的“修改”指的就是这个意思。
sqlite3_update_hook(D,C,P) 函数返回之前对同一个 数据库连接 D 的调用中的 P 参数,或者对于对 D 的第一次调用返回 NULL。
另请参阅 sqlite3_commit_hook()、sqlite3_rollback_hook() 和 sqlite3_preupdate_hook() 接口。