„Kompaktowanie” bazy danych SQL po usunięciu rekordów za pomocą SQLiteMan

1

Korzystam z SQLiteMan do edycji / usuwania historii wiadomości Skype, jak opisano w licznych przewodnikach w sieci. Czyli otwieram main.dbplik Skype'a w folderze mojego profilu za pomocą SQLiteMan i wybiórczo usuwam niektóre rekordy w messagestabeli. SQLiteMan pozwala mi to zrobić ręcznie lub przy użyciu DELETEinstrukcji SQL . Na powierzchni wszystko działa zgodnie z oczekiwaniami: rekordy są usuwane, a Skype nie wyświetla już usuniętych wiadomości w swojej historii.

Jest jednak jeden mały problem, który nie wydaje się być omawiany w przewodnikach zarządzania historią Skype w sieci. Rekordy nie są fizycznie usuwane main.db, ale raczej oznaczone jako „usunięte” (co z pewnością jest rozsądnym rozwiązaniem z punktu widzenia zarządzania bazą danych). Otwarcie main.dbw edytorze binarnym pokazuje, że zawartość usuniętych rekordów jest nadal doskonale widoczna w pliku. Oczekuje się, że rozmiar main.dbpliku nie zmienia się bez względu na to, ile rekordów usuwam.

Jest to oczywiście nie do przyjęcia z punktu widzenia prywatności / bezpieczeństwa.

Czy jest więc jakiś sposób na wymuszenie fizycznego usunięcia niepożądanych zapisów po powyższym „miękkim” usunięciu? Czy istnieje sposób na „kompaktowanie” fizycznego pliku bazy danych SQL? Alternatywnie, czy istnieje sposób, aby poprosić silnik SQL o wyzerowanie zawartości „miękkich” skasowanych rekordów, aby uczynić je nieczytelnymi?

Mrówka
źródło
1
Nie jestem pewien, kiedy rekordy zostaną usunięte, ale być może UPDATEinstrukcja SQL, która ustawia odpowiednie pola, aby NULLmogła robić, co chcesz.
Excellll,
@Excellll: Tak, też o tym pomyślałem. Mogę zrobić UPDATEdla kolumny tekstu wiadomości ( body_xml) przed faktycznym usunięciem. Ciekawe byłoby, czy możliwe jest fizyczne usunięcie rekordów. A może jest to sprzeczne z fizycznymi zasadami organizacji baz danych SQL?
AnT
1
@Excellll: BTW, ustawienie pól, które NULLrównież wydają się być realizowane za pomocą pewnego rodzaju miękkiego etykietowania. Działa na poziomie SQL, ale fizyczny plik bazy danych nadal zachowuje oryginalny tekst wiadomości. Więc dla celów prywatności NULLnie działa. Trzeba użyć czegoś podobnego xxxxxx....x, np. Wzoru, który blokuje całe pole.
AnT
Możesz również użyć VACUUMpolecenia SQLite.
Castaglia 17.04.16