開発のヒント

Accessは壊れやすい?

Accessは壊れやすいと言われています。
今まで何も問題なく動いていたのに、急に見慣れないメッセージが表示されて困ったことがあるかもしれません。
そこで、出来るだけ壊れなくする方法や、困った時の対処方法について記載します。
また、動きが遅くて困った時の考え方についても触れます。

1.Access使用中にエラーが発生した場合の主なメッセージには、以下のものがあります。

Accessの主なエラーメッセージ
  • 『モジュールがありません』
  • 『直前のコマンド(操作)がキャンセルされました。』
  • 『Accessに問題が発生しました。ご迷惑をおかけいたしまして...』
  • 『システムで予約されたエラー』
  • 『修復する必要があるか、データベースではありません』
  • 『データベースが開いているときに、いずれかのユーザーが、Accessを終了しました』
  • 『このデータを修復しますか?』
  • 『エラーが発生したため、MSACCESS.exe を終了します。プログラムをもう一度開始する必要があります。エラーログを作成しています。』

以上のメッセージが表示された場合は、Accessが壊れている可能性があります。(というか壊れています。)
この場合は「最適化/修復」で使用可能になる可能性が大きく、ほとんどの場合は正常に戻ります。

致命的なエラーメッセージとして以下のものがあります。
  • 『権限がありません。』

このメッセージの場合、壊れていて、しかも「最適化/修復」で復旧できる確立は残念ながら低いです。
※これはAccessに限ったことではないですが、いざという時に備えてバックアップはしっかり取りましょう。

2.Accessが壊れる原因や対策について

Accessは本来1人で使用するものとして開発されたため、複数人による同時使用では問題が発生しやすいようです。

では、同時に何人まで使用できるか
  • 同時使用人数の制限は255と言われていますが、これはAccessのシステム上の制限です。
  • 何人が同時に使用したら壊れるという明確なものは無く、2人で使用していて壊れることもあり、20人で使用しても壊れないこともあるようです。
  • 一般的には5人程度が限界と言われることが多いです。

※ただし、同時使用人数が多くなればなるほどパフォーマンスに影響が出るので、先ほどの例は「壊れないかもしれないけど」実用上問題があると言えます。
同時使用人数が増えた場合、SQL Serverにアップグレードした方が良いでしょう。

SQL Serverの場合、いくつかあるエディションの中でも以前のMSDEの位置付けと言えるExpressならデータベースの容量が10GBまで(2008 R2以降。2008以前は4GB)と制限はありますが、MSDEと違ってSQL Server Management Studio(SSMS)でデータベースの操作ができて(※1)、小規模なシステムなら実用上問題無いレベルなので、検討してみる価値は十分にあると思います。

※1:制限はありますが、かなり色々なことができます。

テーマがAccessが壊れやすいと言われている事についてなので、タイトルに「壊れる原因」とありますが、テーブルやフォーム、クエリなどすべてが入っている1つのaccdb(Access2003までのmdb)を共有サーバーに置いて、これを複数で使用するようなことがない限り、それよりも「同時使用人数=パフォーマンスへの影響」の方が大きいです。
ただしレスポンスについては、マシンスペックやネットワークの状況に大きな影響を受けることが多いです。

対策方法は
  1. フォームやクエリ等とテーブルを別々のaccdbに分けます。
    (ここでは、フォームやクエリなどのaccdbを「プログラム用accdb」と呼びます。また、テーブルを格納しているaccdbを「データ用accdb」と呼びます。)
    そしてプログラム用accdbからデータ用accdbをリンクして使用します。 この場合、データ用accdbを共有サーバーに置き、これとリンクしたプログラム用accdbを各自のPCのデスクトップ等に置き、こちらを起動して使用します。
  2. フォームはテーブルを連結せずに非連結で作成します。
    ただし、プログラム用accdb内でローカルのワークテーブルとして使用するテーブルについては連結しても問題ないです。
  3. 定期的にバックアップ及び「最適化/修復」を行います。

その他、データベースの設計等ありますが、これらでかなり回避できます。

3.どのAccessに問題があるのか

ここでは最低限の対策として、プログラム用とデータ用にaccdbを分けた場合とします。

ある一人にのみエラーが出て、他の人は正常に使用出来ている場合

エラーが発生している人のPCのデスクトップ等に置いて使用しているプログラム用accdbに問題があると言えます。 この場合は、使用している「プログラム用accdb」を一旦削除して、問題の無いプログラム用accdbをコピーして、そのaccdbを起動することで正常に動作するようになります。

※いつでもコピーできるように共有サーバーのどこかに置いておくと良いです。

複数の人が使用してエラーが出る場合

「データ用accdb」に問題がある(壊れている)可能性があります。 この場合は「最適化/修復」を行って下さい。 ただし、「最適化/修復」を行ってもエラーが出て「データ用accdb」が復旧できないという最悪のケースも無いとは言えないので、バックアップは必須と考え取っておくようにして下さい。

※あるタイミングで手動で取る方法もありますが、忘れることもあるし、取るタイミングもまちまちだとあまり良いとは言えません。

ちなみに私が開発する場合、以下のようなリクエストがよくあります。

  1. 使用者の手間を極力少なくしたい。
  2. バックアップは曜日別に取る。

そこで、その日の最初にプログラム用accdbを起動した人が自動的に「最適化/修復」とバックアップが出来るように、プログラムを作成します。

4.手動による「最適化/修復」の操作方法

Access2003までの場合
  1. Accessの使用を完全に止める。(誰も使用していない状態にする。)
  2. 事前に対象となる「データ用mdb」をコピーしておく。(「最適化/修復」中に何か問題が発生した場合に備えて。)
  3. データ用mdbを開く。
  4. 画面上部のメニューの「ツール」→「データベース ユーティリティ」→「最適化/修復」を選択。
    データベースウィンドウの表示が消え、画面左下に『最適化しています』と表示されます。
    mdbのサイズにもよりますが、通常数秒から数十秒で「最適化/修復」は終了し、セキュリティ警告のダイアログが表示され、「開く」をクリックするとデータベースウインドウが再度表示されます。
  5. mdbを閉じます。