引き続き、sqlparse v.1.1 のテストを行ってみます。
昨日はページ内の削除レコードを検出する部分を試したわけですが、ページ内での上書きが発生した場合やページ再利用時にどうなるかテストしてみます。
まず、昨日と同じくサンプルのデータベースファイルとテーブルを作成します。下記は5件のレコードが存在しているリーフページです。
Secure Deleteがオフの状態で、このテーブル内のデータ 5件を全て一括削除してみます。
この状態であれば、Sqlpaeseで処理すると以下のように削除レコードを検出してくれます。
Type Offset Length Data
Unallocated 520 504 T#hogehoge005C#hogehoge0042#hogehoge003!#hogehoge002#hogehoge001
現在、ページ内には過去のレコード5件が残っていますが、この状態のまま新規にレコードを作成すると、以下のように過去のレコードが上書きされていきます。(1件だけレコードを追加)
この状態でも、Sqlpaeseで処理すると以下のように削除レコードを検出してくれます。
Type Offset Length Data
Unallocated 522 486 T#hogehoge005C#hogehoge0042#hogehoge003!#hogehoge002
次は若干トリッキー?なことをしてみます。レコード2はとても長い文字列を入れていますので、1レコードには収まりませんので、別のページが割り当てられた状態になります。
部分的に別ページにデータが存在する状態で、このレコードを削除してみたのが下記の状況です。
青い線の下にあるページ内には文字列が存在していることを目視であれば確認できますが、sqlparseで処理した結果は下記です。
Type Offset Length Data
Unallocated 524 298 6
Free Block 839 169 ?port139port139port139port139port139port139port139port139port139port139port139port139port139port139port139port139port139port139port139port139port139port139por
Free Block 839 の位置は青い線より上の部分にあり、ページが再利用されている青い線より下にあるデータは拾えてないことが分かります。
仕様を詳しく確認していないのですが、ページが別用途で再利用されていたりする場合には、そのページ内にレコードが残っていても検出しないかもしれません。