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