データベース設計(Access)

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

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

こんにちは。システム担当の父親、KATSUです。
Excel歴20年、Access歴10年ですが、ブログ歴は約2年です。
週1回の記事更新を目標にしています。

今回は、Accessをマルチユーザーで運用するために必要なことについて書いてみました。

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

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

このような方は、一度本記事の内容をご覧ください。
現在使っているAccessシステムの延命につながヒントが得られるかもしれません。

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」を削除するだけです。

全てのテーブルがリンクテーブルにさしかえられました。

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

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


Accessテーブルの替わりにSQL SERVER EXPRESSを使うというのも定番の方法ですので、頭の片隅に入れておきましょう。
いずれ近いうちにSQL SERVER EXPRESSの設定方法についても解説していきます。

BusinessバージョンのMicrosoft365の場合、AccessをSharepointに取り込む方法もあるようです。
Microsoft公式サイトで解説しているようですので、興味のある方は参考するとよいですね。

SharePoint にデータをインポート、リンク、または移動する

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

トランザクション処理を使えば、テーブルへの接続時間を必要最小限にすることができます。
トランザクション自体が聴き慣れない言葉ですよね?
トランザクションはさまざまなシステムで使われています。
ここで、Accessのトランザクションの流れについて簡単に触れておきます。

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

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

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

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

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

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

標準モジュールは「Tran_Sample」と「Delete_Data」の2つのプロシージャがあります。
ステップイン実行でコードの動きを確認してみましょう。
トランザクションがどのようなものかが理解できると思います。

また、トランザクションを設定する時に注意しないといけないことがあります。

例えば、主キーが元データと重複しているものがあった場合、検知する仕組みを作っていないとそのままコミットされます。
結果、重複していないデータのみが追加されてしまい、想定された動きが実現されません。

トランザクション開始からコミットまでにエラーを検知し、ロールバックに送る仕組みは必要に応じて作っておきましょう。


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

created by Rinker
技術評論社
¥2,838 (2021/12/01 21:34:13時点 Amazon調べ-詳細)

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

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

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

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

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

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

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

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

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

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

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

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

まとめ

今回は、Accessを同時編集できるようにするための方法について解説しました。

データベースの作り方を少し見直すだけで、今までよりも丈夫なAccessに改造することができます。

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

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

今後も、ExcelやAccessについての役立つ内容を投稿していきますので、どうぞよろしくお願いします。
本日も最後までありがとうございました。

スポンサーリンク

-データベース設計(Access)