SQLでデータを再構築する
日付 | 2011/08/30 |
---|---|
ID | 11-006 |
バージョン | v12 |
プラットフォーム | Windows, Mac |
あまり考えたくない事ですが、データファイルが度々壊れてしまうようなとき、データファイルの再構築を考えなければならないことがあります。4D v11以前のバージョンで、SEND RECORDコマンドやRECEIVE RECORDコマンドを使用して、データベースの再構築を行ったかもしれません。しかし、その方法は完全ではなく、壊れたデータをそのまま新しいデータベースに移してしまう可能性があります。より良い方法として、XMLで書き出したり読み込ませる方法がありますが、XMLのパースに時間が掛かるのが難点でした。
4D v12では、SQLステートメントとして全てのデータを書き出すコマンドがありますので、それを使う事で、データをもれなく再構築することができます。またXMLでの書き出し/読み込みと比較して、短時間で再構築することができます。
SQL EXPORT DATABASEコマンドは、全てのテーブルに含まれるデータをSQL文の形、つまりテキストデータとして出力します。たとえBLOBやピクチャ型のバイナリデータがあったとしても、それらバイナリデータも確保した形でSQL文として生成されるので、問題なく全てのデータをバックアップすることができます。
具体的には、次のコードは、データベースフォルダに全てのデータをバックアップします。
//全データをSQLステートメントファイルに保存 $folder_path:=Get 4D folder(Database folder)+"exportdata"+Folder separator SQL EXPORT DATABASE($folder_path)
このようにしてバックアップされたデータを復旧するには、SQL文で書かれているので、SQL EXECUTE SCRIPTコマンドでSQL文としてファイルを実行すれば良いということになります。SQL EXPORT DATABASEコマンドは、テーブル毎にフォルダを生成しているので、それらを復元するためには、フォルダ構造を考慮してSQL文のファイルを指定しなければなりません。具体的には、次のようにします。
//SQLステートメントファイルより全データを復元 $folder_path:=Get 4D folder(Database folder)+"exportdata"+Folder separator+"SQLExport"+Folder separator FOLDER LIST($folder_path;$folder_names) For ($i;1;Size of array($folder_names)) DOCUMENT LIST($folder_path+$folder_names{$i};$doc_names) For ($i2;1;Size of array($doc_names)) if($doc_names{$i2}="Export@") SQL EXECUTE SCRIPT($folder_path+$folder_names{$i}+Folder separator+$doc_names{$i2};SQL on error confirm) end if End for End for
データベースの破損は避けなければなりませんが、万が一の場合で再構築が必要なときには、上記の方法をお試しください。
追記:
SQLステートメントファイルより全データを復元する際には、新規にデータファイルを作成して、空のデータファイルにデータを復元してください。