int sqlite3session_attach( sqlite3_session *pSession, /* Session object */ const char *zTab /* Table name */ );
如果参数 zTab 不是 NULL,则它是要附加到作为第一个参数传递的会话对象的表的名称。在会话对象处于启用状态时对表进行的所有后续更改都将被记录。有关更多详细信息,请参阅 sqlite3session_changeset() 的文档。
或者,如果参数 zTab 是 NULL,则记录数据库中所有表的更改。如果在此调用之后向数据库添加了其他表(通过执行“CREATE TABLE”语句),则也会记录新表的更改。
只能为在 CREATE TABLE 语句中显式定义了主键的表记录更改。主键是“INTEGER PRIMARY KEY”(rowid 别名)与否无关。主键可以由单个列组成,也可以是复合主键。
如果数据库中不存在指定的表,则不会出错。如果指定的表没有主键,也不会出错。但是,在这两种情况下都不会记录更改。
不会为在其一个或多个主键列中存储有 NULL 值的单个行记录更改。
如果调用完成没有错误,则返回 SQLITE_OK。或者,如果发生错误,则返回 SQLite 错误代码(例如 SQLITE_NOMEM)。
从 SQLite 版本 3.22.0 开始,"sqlite_stat1" 表是上述某些规则的例外。在 SQLite 中,sqlite_stat1 的模式为
CREATE TABLE sqlite_stat1(tbl,idx,stat)
即使 sqlite_stat1 没有主键,也会记录对其的更改,就好像主键是 (tbl,idx) 一样。此外,还会记录 (idx IS NULL) 为真的行的更改。但是,对于这样的行,会在更改集或补丁集中存储一个零长度的 blob(SQL 值 X''),而不是 NULL 值。这样一来,旧版本的 sqlite3changeset_invert()、concat() 以及类似函数就可以操作这样的更改集。
sqlite3changeset_apply() 函数在更新 sqlite_stat1 表时会自动将零长度的 blob 转换回 NULL 值。但是,如果应用程序直接调用 sqlite3changeset_new()、sqlite3changeset_old() 或 sqlite3changeset_conflict()(包括传递给冲突处理程序回调的更改集迭代器)上的更改集迭代器,则会返回 X'' 值。如果需要,应用程序必须将 X'' 自行转换为 NULL。
旧版(早于 3.22.0)的会话模块无法捕获对 sqlite_stat1 表的更改。旧版本的 sqlite3changeset_apply() 函数会静默地忽略更改集或补丁集中包含的对 sqlite_stat1 表的任何修改。