ExcelとAccessのスキルアップをサポートするサイトです

ExcelとAccessの学習室

Accessをマルチユーザーで運用するために必要なこと(DB分割・トランザクション)

この記事はプロモーションを含みます

この記事で学習できること
  • Accessをマルチユーザーで使用するために必要な設定が分かる
  • データベースの分割とトランザクションへの理解が深まる

今回は、Accessをマルチユーザー(複数人数)で運用するために必要な設定・テクニックについて書いてみました。

Accessはスタンドアロン環境でしか使えない」といったことがよく言われますが、設定をしっかりと行えば同時編集での運用も可能です。

  • Accessの機能に限界を感じている
  • Accessシステムの機能拡張のために外注を検討している

このような方は、まずは本記事の内容をご覧ください。
今使っているAccessシステムを、さらに長く、より効果的に使うためのヒントが見つかるかもしれません。

Accessを複数人で共有するリスクを解決する

「Accessを複数人で共有すると壊れやすい」という話を耳にしたことはありませんか?
実際、その原因の多くは、編集しているテーブルやレコードが重なってしまうことにあります。

たとえば、同じテーブルでもそれぞれが別のレコードを編集している場合、お互いに干渉し合わないため、システムへの負荷はそれほど大きくありません。

しかし、同じレコードを同時に編集しようとすると、どちらの変更を優先すべきかAccessも混乱してしまい、エラーの発生やAccessファイルが壊れる原因になります。

また、通常の設定では、Accessのフォームは「連結フォーム」として、テーブルと常に接続された状態になっています。
そのため、2人が同時に同じデータを編集してしまうリスクが高まります。

こうしたリスクを避けるために、以下の2つの方法でAccessをマルチユーザー仕様に進化させましょう。

「Accessを複数人数で共有すると壊れやすい」というのは、編集しているテーブル・レコードが被ってしまうことが大きな原因です。

同じテーブルでも違うレコードを編集している場合はお互いに干渉し合わないので、Accessテーブルへの負荷は高くありません。
しかし、同じレコードを同時編集すると、どちらを優先されたら良いかコンピュータも迷ってしまいます。

更に、通常のAccessフォームの基本設定では、テーブルとフォームが常につながっている「連結フォーム」が作られるようになっています。
連結フォームは、テーブルと常に接続されている状態なので、2人同じデータを触ってしまうリスクがつきまといます。

そこで、以下の2つの方法を行い、Accessをマルチユーザー仕様へと進化させましょう。

  • データベースを分割して同時編集できる環境を作る
  • トランザクション処理を使ってテーブルへの書き込み時間を最短で済ませる

では、これからもう少し深掘りして解説していきます。

設定1-データベースを分割する

Accessの初期設定では、テーブルやフォームなど、全てのオブジェクトが一つのAccessファイルに格納されます。
スタンドアロン環境であれば初期設定でも問題ないのですが、複数人数での運用はさまざまなエラーや障害が頻繁に発生してしまうのです。
まず、フォームとテーブルが常にリンクしているので、データの不整合が起こしやすいです。

また、全てのAccessをひとつにまとめておくとメンテナンスがしづらいということも大きなデメリットです。
誰かがAccessを操作しているときはメンテナンスを行えないので、誰も使っていないときまで待つしかありません。

まずはデータベースを分割し、Accessファイルを複数人数で同時につなげられる環境を作りましょう

  • テーブルのみのAccessファイル→バックエンド側
  • フォームやクエリなど他のオブジェクト→フロントエンド側

Accessを分割すれば、フロントエンド用のAccessファイルを増やすことができます。
フロントエンド用のAccessファイルを増やせるということは、同時編集が可能なユーザー数も好きなだけ増やせるということです。
データベースを分割することは、安全にマルチユーザー仕様に拡張するための必須事項です。

データベースの分割はかんたんな手順で実現できますので、以下の手順に沿って実践してみましょう。

分割手順1-Accessファイルをコピー

Excelファイルなどと同じような感じでAccessファイルをコピーします。

それぞれ分かる名前に変更しておきましょう。
ここでは「Back」と「Front」と追記し、判別しやすいファイル名にしました。

分割手順2-バックエンドデータベースを作成

バックエンド側のAccessは、テーブル以外の全てを削除しておきましょう。

分割手順3-フロントエンドとバックエンドを連結させる

一方、フロントエンド側はバックエンド側のテーブルをリンクします。
これからテーブルをリンクさせる方法について解説します。

外部データ」タブの「新しいデータソース」を選びます。

次に、「データベースから」の「Access」をクリックします。

リンクしたいバックエンドデータベースを選択します。
データの保存方法は「リンクテーブルを作成して・・・」を選択しましょう。

テーブルは全て選択です。

取込作業が終わると、リンクテーブルが作成されているのが分かります。
リンクテーブルは、通常のテーブルとはアイコンが違うのが大事なポイントです。

全てのリンクテーブル名を修正しましょう。
末字の「1」を消去するだけです。

これでリンクテーブルへの差し替えが完了しました。

リンク元は絶対パスで設定されます。
バックエンドファイルを別の場所に移動させるとリンクが切れますので、動かさないようにしましょう。
一方、フロントエンドファイルは複製させたり移動させてもOKです。

バックエンドファイルは定期的なバックアップの仕掛けを作っておくと、より安心です。

設定2-トランザクション処理を行う

トランザクション処理を使えば、テーブルへの接続時間を最短にすることができます。
分かりやすく言い換えると、「瞬間的に接続し、瞬間的に遮断する」という表現でしょうか。

トランザクション自体が聴き慣れない言葉ですよね?
トランザクションはさまざまなシステムで使われています。
ここで、Accessのトランザクションの流れについて簡単に触れておきます。

トランザクションでどのようにデータが処理されるのか?

トランザクションを一言で言い換えると、複数のクエリを予約しまとめて実行する機能です。

ここでクエリと表現しているものは、SELECT文以外の更新・追加・削除が予約できるクエリ文のことです。
予約の段階ではデータは変更されておらず、「Commit」を実行することで一気に新しいデータが書き込まれます。
何らかの不具合が発生して更新できない場合は、「RollBack」によりデータが予約前に戻されます。

トランザクションのCommitはVBAのコード文一行で実行されますので、テーブルに触れる時間は瞬間的です。
文章だけでは動きが分かりづらいと思いますので、念のためにサンプルデータベースを添付しておきます。

サンプルデータベース:Trans_Test.Accdb

サンプルデータベースを開くと、テーブル「社員マスタ」と標準モジュール「Trans」があるだけです。
更に、「社員マスタ」には1件も入っていません。

標準モジュールには、「Tran_Sample」と「Delete_Data」の2つのプロシージャがあります。

では、トランザクションの動作を理解するためにも、ステップイン実行でコードの動きを確認してみましょう。

トランザクション開始直後にはINSERT文が設定されています。INSERT文は新しいデータを追加するデータベース言語(SQL)です。
また、INSERT文の実行直後のコミットを実行するコードに、ブレークポイントを設定します。

コードを実行すると、ブレークポイントで処理が停止します。
ここはCommitを実行する直前です。

テーブルを確認してみると、確かにデータ件数が0のままです。

F8キーを押して、Commitを実行してみます。

ここでようやく2件のデータが挿入されました。
つまり、INSERT文が実行されたということです。

いったん、プロシージャ「Delete_Data」を実行し、テーブルをリセットします。

今度は、INSERT文がエラーを起こすように変更してみましょう。
具体的には、文字列を挿入する時に必要な「'」を消去します。

コミットではなくRollBackが実行されました。

テーブルデータを確認したところ、テーブルのデータ件数は0件でした。
ロールバックでデータ挿入が中止されたためです。

仮にトランザクションが設定されていないと、途中までデータが挿入されたところで止まってしまいます。
完全にスタンドアローンで運用していれば手動での復旧も可能ですが、複数人数で同時接続している場合、おそらく完全なデータ復旧は不可能です。

以上のように複数人数でAccessを運用する場合、トランザクション実装はデータの整合性を担保できる安全な施策だと言えます。


サンプルデータベースのプログラムコードは、今村ゆうこさんの「Access VBA 実践マスターガイド」を参考にさせていただきました。
本記事で使っているコードよりも、更に実用に沿ったトランザクションのサンプルコードが載っているのでオススメです。

トランザクションを何かに例えてみる

ここで、トランザクションを宅配の方法に例えてみましょう。

トランザクションを設定していないのは、自転車で届け先に人力で一つ一つ配達しているようなものです。
一方、自動運転の配達がトランザクションが設定されているという状態に近いでしょうか?
配達前に全ての届け先リストと順番を登録しておけば、自動運転ボタンを押すだけで順番に届け先へ配達されます。

自動運転ボタンを押す前であればキャンセル(RollBack)が可能です。

他にも、トランザクションをマンションのオートロックに例えたりすることもあります。

一レコードだけの処理は非連結フォームを活用

Accessフォームで、単票形式というものがありますよね?
単票形式にトランザクションを実装するときは「非連結フォーム」にしておくのが原則です。
「非連結」とは、バックエンド側にあるAccessテーブルには接続されていない状態にしておくということです。

トランザクションを起動させるのは更新ボタンを押した瞬間です。
「連結フォーム」は常にテーブルと連結しているので、更新ボタンを押す前にテーブルのデータが書き換えられてしまいます。
正常にトランザクションを作動させるためにも、単票フォームは「非連結フォーム」を使用しましょう。

複数レコードの処理はワークテーブルを活用

業務の中では、複数レコードをまとめて編集したいこともありますよね。
そんな時は、フロンドエンド(ユーザー)側のAccessファイルに編集用のワークテーブルを設置しましょう。

非連結フォームでは編集したデータが更新前に消えてしまうので、ユーザー側で仮データを保存しておくというイメージです。
フォームとワークテーブルは、「連結フォーム」でリンクされています。
表示ボタンが押されると、原本からコピーされたデータを取得します。
データの編集が済み、更新ボタンを押すことでワークテーブルから本テーブルへデータが一括で貼り付けられます。

本テーブルからワークテーブルなどからデータを取得する場合は、コンボボックスなどで前もって条件を絞っておくことでより安全にデータを管理できます。
編集されたレコードにチェックが入るようにしておけば、更新レコード数を更に減らせます

まとめ

今回は、Accessを同時編集するために必要な設定について解説しました。
データベースの作り方を少し見直すだけで、今までより丈夫なAccessに改造することができます。

  • Accessをどうやって拡張しようか悩んでいる方
  • Accessでシステムを作ることに不安を抱えている方

以上の項目に当てはまる方は、本記事の内容を参考にしながら今後の方針を立てていただければと思います。


最後に、ブログではAcccessやExcelの機能について、いろんな記事を投稿しています。
よかったらトップページから希望の機能を探してみてください。

また、Accessデータベース設計のまとめ記事もありますので、そちらもごらんください。
≫ Access初学者必見!データベース設計ガイド