2009-01-08 4 views
9

Tôi đang tìm cách thiết lập (thông qua SQL) một bảng nhật ký chứa tất cả mọi thứ đã được thực hiện cho cơ sở dữ liệu sqlite của tôi (tốt nhất là chèn, tạo bảng vv .. như đã phát hành cho cơ sở dữ liệu). Tôi chắc chắn có cách để làm điều đó thông qua thiết lập kích hoạt trên mỗi bảng, nhưng đó chỉ là WAY quá nhiều công việc và không bode tốt nếu tôi thay đổi lược đồ cơ sở dữ liệu sau này. Có một điều toàn cầu bắt tất cả làm việc trên cơ sở dữ liệu (như kích hoạt trên cơ sở dữ liệu riêng của mình)?giữ bảng nhật ký trong cơ sở dữ liệu sqlite?

Tôi cũng mở cho các đề xuất khác để lưu hồ sơ các thay đổi được thực hiện cho cơ sở dữ liệu sqlite để tôi có thể xem lại vài tháng sau đó về các thay đổi.

(Có lập trình tất nhiên có nhiều cách nhưng tôi không thể chắc chắn rằng chương trình của tôi là chương trình duy nhất ghi vào cơ sở dữ liệu).

+1

Nếu có một kích hoạt trên cơ sở dữ liệu, nó sẽ không tự cháy? – recursive

Trả lời

0

những chức năng có thể hữu ích

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* 
); 

họ dường như hoạt động trên dbs cá nhân

cách duy nhất toàn cầu tôi có thể thấy là sử dụng

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

Các chức năng dường như chỉ hoạt động khi ai đó viết vào cơ sở dữ liệu bằng cách sử dụng api của chúng, nhưng tôi đang tìm cách để lại một bản ghi khi bất kỳ ai (có khả năng không phải chương trình của tôi) ghi vào cơ sở dữ liệu. – polyglot

7

Mặc dù sau không đáp ứng tất cả các yêu cầu của bạn, bạn có thể muốn thấy một cách để làm điều đó. Mike Chirico's SQLite Tutorial có một phần trên Ghi nhật ký tất cả Chèn, Cập nhật và Xoá bắt chước chức năng của binlog của MySQL.

Tùy thuộc vào trình kích hoạt phải phù hợp với giản đồ cho mỗi bảng có thay đổi bạn muốn theo dõi. Tức là, nếu bảng của bạn có một trường được gọi là "a", thì bảng ghi nhật ký cần theo dõi "aOLD" và "aNEW". Bằng cách này, trình kích hoạt có thể ghi lại các cập nhật, chèn và xóa được thực hiện cho các trường trong bảng cụ thể đó.

+0

Tôi chưa từng sử dụng SQL Lite nhưng bạn có thể chạy lại lược đồ và sau đó bạn có thể tạo một kịch bản cập nhật trình kích hoạt và bảng lịch sử của mình. –