2009-01-08 97 views
9

我正在尋找一種方法來設置(通過SQL)一個日誌表,其中包含對sqlite數據庫所做的所有操作(最好根據發佈到數據庫的插入,創建表等語句)。我確定有辦法通過在每個表上設置觸發器來完成它,但這只是太多的工作,並且如果稍後更改數據庫的模式,這並不是一個好兆頭。在數據庫中是否有全局的全局事物(比如觸發數據庫本身)?在sqlite數據庫中保留一個日誌表?

我也打開其他建議,保持對sqlite數據庫所做的更改的記錄,以便我可以回顧幾個月後的變化。

(編程方式當然有辦法,但我不能確定我的程序是寫入數據庫的唯一程序)。

+1

如果數據庫中有觸發器,它會不會自動啓動? – recursive 2009-01-08 02:28:56

回答

0

這些功能可能是有用的

void *sqlite3_update_hook(
    sqlite3*, 
    void(*)(void *,int ,char const *,char const *,sqlite3_int64), 
    void* 
); 

void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); 

void *sqlite3_profile(
    sqlite3*, 
    void(*xProfile)(void*,const char*,sqlite3_uint64), void* 
); 

他們似乎作用於個體DBS

全球唯一的辦法,我可以看到的是使用

sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); 
int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); 
int sqlite3_vfs_unregister(sqlite3_vfs*); 
+0

這些函數似乎只有在使用api寫入數據庫的人明確地掛鉤時才起作用,但我正在尋找一種方法,當有人(可能不是我的程序)寫入數據庫時​​也會留下記錄。 – polyglot 2009-01-08 21:04:33

7

儘管以下不滿足你的所有要求,你可能希望看到一種方法來做到這一點。 Mike Chirico's SQLite Tutorial上有一個部分,記錄所有插入,更新和刪除,它們模仿MySQL的二進制日誌的功能。

它依賴於觸發器,它必須與您希望跟蹤其更改的每個表的模式相匹配。也就是說,如果你的表有一個名爲「a」的字段,那麼記錄表需要跟蹤「aOLD」和「aNEW」。通過這種方式,觸發器可以記錄更新,插入和刪除特定表中的字段。

+0

我從來沒有使用過SQL Lite,但是你可以檢索模式,然後你可以創建一個更新觸發器和歷史表的腳本。 – 2009-01-30 09:08:37