int sqlite3session_attach( sqlite3_session *pSession, /* Session object */ const char *zTab /* Table name */ );
如果引數 zTab 不為 NULL,則為要附加至傳遞為第一個引數的 Session 物件的資料表名稱。在啟用 Session 物件時對資料表進行的所有後續變更都會記錄下來。請參閱 sqlite3session_changeset() 的文件以取得進一步詳細資訊。
或者,如果引數 zTab 為 NULL,則會記錄資料庫中所有資料表的變更。如果在進行此呼叫後將其他資料表新增至資料庫(透過執行「CREATE TABLE」陳述式),也會記錄新資料表的變更。
只能記錄 CREATE TABLE 陳述式中明確定義為 PRIMARY KEY 一部分的資料表的變更。PRIMARY KEY 是否為「INTEGER PRIMARY KEY」(rowid 別名)並不重要。PRIMARY KEY 可能包含單一欄位,或可能是複合鍵。
如果命名資料表不存在於資料庫中,並非錯誤。如果命名資料表沒有 PRIMARY KEY,也並非錯誤。但是,在這些情況下都不會記錄任何變更。
對於 PRIMARY KEY 欄位中一個或多個儲存 NULL 值的個別列,不會記錄變更。
如果呼叫完成且沒有錯誤,則會傳回 SQLITE_OK。或者,如果發生錯誤,則會傳回 SQLite 錯誤代碼(例如 SQLITE_NOMEM)。
從 SQLite 版本 3.22.0 開始,「sqlite_stat1」表格是上述部分規則的例外。在 SQLite 中,sqlite_stat1 的架構為
CREATE TABLE sqlite_stat1(tbl,idx,stat)
即使 sqlite_stat1 沒有 PRIMARY KEY,也會記錄其變更,就像 PRIMARY KEY 是 (tbl,idx) 一樣。此外,也會記錄 (idx IS NULL) 為 true 的列的變更。但是,對於此類列,會在變更集或修補程式集中儲存零長度 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)的 sessions 模組版本無法擷取對 sqlite_stat1 表格所做的變更。舊版的 sqlite3changeset_apply() 函式會靜默略過變更集或修補程式集中對 sqlite_stat1 表格所做的任何修改。