int sqlite3_snapshot_open( sqlite3 *db, const char *zSchema, sqlite3_snapshot *pSnapshot );
sqlite3_snapshot_open(D,S,P) 介面會針對 資料庫連線 D 的綱要 S 啟動新的讀取事務或升級現有的讀取事務,使讀取事務參考歷史快照 P,而不是資料庫的最新變更。sqlite3_snapshot_open() 介面在成功時會返回 SQLITE_OK,如果失敗則會返回適當的 錯誤碼。
為了成功執行,呼叫 sqlite3_snapshot_open(D,S,P) 時,資料庫連線不能處於 自動提交模式。如果綱要 S 上已經開啟讀取事務,則資料庫控制代碼不能有任何作用中的陳述式(已傳遞給 sqlite3_step() 但尚未傳遞給 sqlite3_reset() 或 sqlite3_finalize() 的 SELECT 陳述式)。如果違反這些條件,或者綱要 S 不存在,或者快照物件無效,則會返回 SQLITE_ERROR。
如果指定的快照已被 檢查點 覆寫,則呼叫 sqlite3_snapshot_open() 將無法開啟。在這種情況下,會返回 SQLITE_ERROR_SNAPSHOT。
如果在呼叫此函式時已經開啟讀取事務,則如果返回 SQLITE_ERROR、SQLITE_BUSY 或 SQLITE_ERROR_SNAPSHOT,則相同的讀取事務將保持開啟狀態(在相同的資料庫快照上)。如果返回其他錯誤碼(例如 SQLITE_PROTOCOL 或 SQLITE_IOERR 錯誤碼),則讀取事務的最終狀態未定義。如果返回 SQLITE_OK,則讀取事務現在在資料庫快照 P 上開啟。
如果資料庫連線 D 不知道綱要 S 的資料庫檔案處於 WAL 模式,則呼叫 sqlite3_snapshot_open(D,S,P) 將會失敗。如果該資料庫連線上沒有先前的 I/O 操作,或者資料庫在資料庫連線上最近一次 I/O 操作之後進入 WAL 模式,則資料庫連線可能不知道資料庫檔案處於 WAL 模式。(提示:對新開啟的資料庫連線執行「PRAGMA application_id」,以使其準備好使用快照。)
只有在使用 SQLITE_ENABLE_SNAPSHOT 編譯時期選項時,sqlite3_snapshot_open() 介面才可用。