Korzystam z SQLiteMan do edycji / usuwania historii wiadomości Skype, jak opisano w licznych przewodnikach w sieci. Czyli otwieram main.db
plik Skype'a w folderze mojego profilu za pomocą SQLiteMan i wybiórczo usuwam niektóre rekordy w messages
tabeli. SQLiteMan pozwala mi to zrobić ręcznie lub przy użyciu DELETE
instrukcji 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.db
w edytorze binarnym pokazuje, że zawartość usuniętych rekordów jest nadal doskonale widoczna w pliku. Oczekuje się, że rozmiar main.db
pliku 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?
UPDATE
instrukcja SQL, która ustawia odpowiednie pola, abyNULL
mogła robić, co chcesz.UPDATE
dla 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?NULL
ró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ściNULL
nie działa. Trzeba użyć czegoś podobnegoxxxxxx....x
, np. Wzoru, który blokuje całe pole.VACUUM
polecenia SQLite.