Accessのテーブル定義やクエリをSQLで出力する

Microsoft Accessのテーブル定義やクエリなど、データベースの構造をSQLで出力(ダンプ)、およびAccessにリストアする方法を紹介します.

SQLにすることで、WinDiffなどでDBの変更前後の差分をとれて便利です。

私がテーブル構造のバックアップに使った分には問題ありませんでしたが,データの損失等は自己責任でお願いいたします.

なお、データをリストアしようとすると、INSERTの順番の関係で外部キーエラーになることがあるようです。

jet-tool

ダンプに使うのは,サードパーティ製のjet-toolというツールです.

なお,使い方はすべてreadmeに書いてあります.

GitHub - himselfv/jet-tool: MS Jet database schema export/SQL execution tool

ダウンロード

下記リンクから、Jet.exeをダウンロードして、コマンドラインで実行すれば良いです。 ( jet-tool-xxx-yyyy.mm.dd.zip に含まれています。)

github.com

なお、使用するにはドライバが必要です。無いと実行時に下記のエラーが発生します。

ERROR: ACCDB format requires Microsoft.ACE.OLEDB.12.0 provider which has not been found. The operations will likely fail.

下記からドライバをダウンロードできます。32ビット版を入れる必要があります。

Download Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント from Official Microsoft Download Center

ダンプ

.accdb形式のAccessファイルをダンプするには下記のコマンドをコマンドプロンプトで実行します. テーブル、クエリ、リレーションシップがダンプされます。

実行結果は標準出力に出るので,ファイルにリダイレクトしています.

Jet.exe dump -f <filepath.accdb> --all --accdb --no-data > dump.sql

<filepath.accdb>にはAccessファイルのフルパスを指定します.

よく使うオプションは下記があります.

  • -f <filepath>: 対象ファイルパス
  • --all: 全てのテーブル,クエリ,リレーションシップを処理対象とする
  • -accdb: accdb形式を対象とする(オプションが無い場合はmdb形式)
  • --no-data: 構造のみダンプし,データをダンプしない
  • --tables: 処理対象のテーブルを指定

リストア

ダンプされるのは通常のSQLなので,これを実行すればリストアされます.

jetツールでは,下記のようにしてSQLを実行できます.

Jet.exe exec -f <filepath.accdb> --accdb < dump.sql

制限

jetツールでダンプできない内容は以下のとおりです. ( jet-tool/Unsupported.md at master · himselfv/jet-tool · GitHub の内容)

  • 参照整合性の無いリレーションシップ

参照整合性付きのリレーションシップのみがエクスポートされます.

参照整合性が無いリレーションシップは,コメントとしてエクスポートされます.

  • Check制約
  • テーブルやクエリの書式や列幅などの表示
  • GUIDオートインクリメントフィールド

これらはエクスポートされません.

なお,テーブルのデザインモードで入力したコメントなどは,Jetツールでのみ解釈される特殊な形式でエクスポートされます. (private extensionモードが有効な場合に限る.これはデフォルトで有効になっている.)

まとめ

AccessのデータベースをSQLで出力すると,DBの構造を変更した前後での差分が取れるなど便利でした.

なお,Jetツールは活発に開発されてはいないようです(not being actively developed)が,最新のコミットは2019年8月だったので,一応ほそぼそとメンテナンスされているようです.