ちょっとしたツールをAccessで開発したいのですが、
Accessファイルを共有するとファイルが頻繁に壊れると伺いました。
そこで以下のような回避策を考えてみたのですが、
効果はありますでしょうか。
これでは、あまり意味がないとか、他に注意したほうが良い点等ありましたら、アドバイスいただければと思います。
なお、ツールは、50名位が使用(同時アクセスは3名~4名程度)予定で、
サーバ上にメインのmdbファイル(以下「サーバmdb」)を、各クライアントにもそれと連携するmdbファイル(以下「クライアントmdb」)を置くことを想定しています。
(1) データは全てサーバmdbで保持する。クライアントmdbには、入力用のフォームと、サーバmdbから取得したデータを一時的に保持するテンポラリのテーブルを持つ。
(2) クライアントmdbからサーバmdbにアクセスし、必要なデータをクライアントmdbにインポートする。
(3) クライアントmdbで、取り込んでデータをもとに、データの追加・修正を行い、当該データをサーバの所定のディレクトリにCSVで出力する
(4) サーバmdbは、日次で、所定のディレクトに配置された、クライアントmdbから出力されたファイルを読み込み、データを更新する
(5) (4)の読込み・更新作業中は、クライアントmdbからサーバmdbにはアクセスしない(外部ファイルで制御)
以上です。
要は、クライアントmdbが、直接サーバmdbを更新しないようにし、参照のみにするということです。
よろしくお願いします。
No.7ベストアンサー
- 回答日時:
No.1です。
「同時アクセス」という言葉は実にあやふやな言葉です。おそらく質問者さんやNo2さんのいう「同時アクセス」は同時に複数人がそのシステムを使用しているという程度の同時アクセスだと思います。
ところが世の中は広くて通常同時アクセスは、同時にデータベースの更新をする人の数を言います。通常データベースの更新は0.1秒とかで終わりますのでその0.1秒を同時に複数人がいくような状況を言います。
No2さんのシステムでは、「クエリ(実際にはDoCmd.RunSQL)で更新」が同時におこる状況を言います。
これが、たまたまであれ同時におこるとやばいわけです。No2さんのシステムはおそらく同時に更新は起こらないシステムなのではないでしょうか?
「数台で同時に入力が発生するテーブルについては 入力用の作業テーブルをクライアント側のプログラム用のMDB内に持たせました。」まぁそれでもいいですけど、.NETアーキテクチャはこんな感じですよね。私はこれはとっても嫌いです。本気で複数人がデータを入力したければ、1行ずつを瞬間瞬間でINSERTしていくべきだと私は考えてます。つまりテーブルあるいはデータベースをロックする時間はセッションを越えてはありえないと思っています。理由は、入力用の作業テーブルを作るとその内容を他人によってすでに変更されてるかもしれないからです。こういう事態についてマイクロソフトは、エラーとして対処せよと言ってますが、そんなことできるわけないですよね。面倒ですもの。
No.8
- 回答日時:
No3です、ファイル共有でなく 厳密に同時アクセス云々となると・・
色々な考えがありますね。
単にアクセス任せにすることも方法です。
同じレコードを同時に編集書き出しをしても、後からの利用者は
既に他のユーザーで変更されているとなります。アクセスが排他制御します。
マスター類の場合は ファイル共有でもアクセス任せにする事もあります。
では、作業用テーブルでの場合
私が書いたのは、伝票などのデータの登録作業をイメージしています。
どんどん追加です。
修正として、作業テーブルに取り込んで作業は、同時に同じデータを複数では考えられないような場面です。
この辺は、システムの要件に関わります。
どうしても、頻繁に同時編集がある様なデータの場合、タイムスタンプを付けて管理しています。
修正用に呼び出したデータのタイプスタンプをキープしておき、Update時にタイムスタンプ値をWhere条件に含めます。
そすると、他のユーザーがUpdateしてタイムスタンプを変更している場合は、自編集内容で上書きを制御できます。
どこまでするかは、システムの内容にもよります。
この辺になると、ファイル共有の問題ではなく別な問題ですが・・
(ファイル共有でなくても、要件によっては考えないといけない問題)
No.6
- 回答日時:
No.2です。
No.5さん> 入力用の作業テーブルをクライアント側のプログラム用のMDB内に持たせました。
概ねNo.5さんのとおりです。作業用テーブルをサーバーに置くと問題があることは経験済みです。そこで、作業用テーブルはワークmdbとし、クライアントに置いています。
作業用テーブルをリンクするとdynasetが使えない等制約がありますが、不便を感じたことはありません。(もっとも私が使っている訳ではありませんが‥‥)
基本的にプログラムmdb内にはテーブルは持っていません。例外として、改廃履歴を記したテーブルと、リンクテーブル名が入ったテーブルがあります。
No.5
- 回答日時:
no3です。
Access95のころ耳にしていたのが、処理していく中でオブジェクトの生成 破棄を頻繁にしていると壊れやすいと聞いていました。
で、処理中でのテーブルの作成・削除はしないようにはしました。
特に多数でのアクセスが想定される場合
数台で同時に入力が発生するテーブルについては 入力用の作業テーブルをクライアント側のプログラム用のMDB内に持たせました。
入力はそのローカルなテーブルに対して行い、登録ボタンでinsertでサーバー用のMDB内のテーブルに書き出しました。
修正時は、該当データをSELECTでサーバーから取ってきて、ローカルなテーブルに格納しました。
同時に使っているけれど、同時にフォームでテーブルを捕まえていない状態にしました。
データ用とプログラム用を分ければ データ用のMDBが壊れる危険性は少なくなると思います。
No.4
- 回答日時:
> Accessファイルを共有するとファイルが頻繁に壊れると伺いました。
Accessで、頻繁に壊れるのは、フォーム、レポート等
テーブル等は、破損したことは、経験上、ありません
Accessで、データ部とインターフェイス部に分離して、インターフェイス部のテーブルは、共用のサーバ上のリンクで、十分、対応可能だと思いますよ
破損して、修復不可能でも、修復前のMDBから、テーブルのインポート可能だから、救済は出来るんだけど・・・
直すのが面倒なので、テーブルのみのMDBと、それにリンクしたインターフェイス用のMDBを、分離して作る慣習が、私の場合、あります
破損した場合、インターフェイス用のMDBは、共用からコピーして終わり
データの追加と削除って、複雑な話をしなくても、大丈夫だと思うけどね
No.3
- 回答日時:
>Accessファイルを共有するとファイルが頻繁に壊れると伺いました。
実際のところどうなんでしょうね?
作り方によるかもしれませんが、私もファイル共有で日々動作する(入力も更新)もACCESSで作成し、十数か所 納品していますが
ファイルが壊れたのは、1回 それも無線LANで運用中に接続が切れた為でそれ以外で 特に問題は無いですけどね・・・
書かれている内容であれば、特に問題になるところは無いように思います。
ご回答ありがとうございます。
いろいろネットで調べてみると、
意外と問題なかったという方と、ほんの数名で利用しただけで壊れたという方がいらっしゃいました。
おそらく、設計の問題なんだと思うのですが、
具体的にどのような設計の違いにより、差が生じているのか、
気になっています。
いざ完成し、配布したあとに頻繁に壊れたら困るので、
何か設計の際に注意されている点があれば、
ご教示いただけますでしょうか。
No.2
- 回答日時:
> サーバmdbは、日次で、所定のディレクトに配置された、クライアントmdbから出力されたファイルを読み込み、データを更新する
一日遅れ(?)の更新でよろしいのでしょうか?
私が作ったのは
・ 15名位が使用(同時アクセスは3名~4名程度)
・ データmdbをサーバー(Windows2000 Server)に置く
の環境です。
むしろ、No.1の回答者 NNoriさん に評価していただきたいです。
(1)データmdbは随時更新するテーブルとし、コード類など更新が少ないテーブルはコードmdbとして分ける。(二本立て)
(2)クライアントのアプリmdbを起動した時、コードmdbをクライアントに(batファイルで)コピーする(毎回上書き)。
(3)データmdbの更新は、クライアント側の中間テーブルで更新データを作成後、クエリ(実際にはDoCmd.RunSQL)で更新する。
(4)コードmdbは更新者が一人なので、直接テーブルを開いて更新している。
稼動して6年経ちましたが、データが壊れたという話は聞いていません。(バックアップは毎日取っているようです)
但し、ユニークな番号を取るところで、「取れなくなった」ということが三度ありましたが、クライアントの全アプリmdbを終了させ、再起動したら直ります。(テーブルの取り合いが発生した後、ldbが残るのではないかと勝手な想像をしています)
No.1
- 回答日時:
そんな面倒なことをやるよりも、ちゃんとしたサーバをaccessでつついたほうがよっぽどいい。
ちゃんとした=有料ではありません。かのMicrosoft製の「SQL Server Express」や「MSDE」を使えばちゃんとネットワークを介したデータベースが無料で手に入ります。
ファイル共有したmdbは3名同時アクセスも厳しいと思いますよ。
回答ありがとうございます。
3名同時アクセスでも厳しいとなると、
使えないですね(^^;;
追加の質問で恐縮ですが、
データベース自体はSQLServer等を使い、
入力だけAccessなら問題ないということでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- サーバー FTPサーバについて詳しい方(アクセス権のないディレクトリを非表示にする方法) 4 2022/08/22 22:33
- ノートパソコン ESETの初期インストールの仕方 1 2022/10/14 08:26
- サーバー 別サーバに構築したApache+Tomcatの連携について 2 2023/03/06 23:23
- サーバー Windows Server 2019 CALについて 3 2022/04/02 16:40
- サーバー ファイルサーバのデータのバックアップ 1 2023/03/15 10:30
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- Windows 10 だいたいの能力はどのくらいでしょうか 3 2023/03/05 17:18
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- PHP PHP でメールフォームを作成したい 1 2022/05/04 22:28
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
このQ&Aを見た人はこんなQ&Aも見ています
-
今年はじめたいことは?
今年はこれをはじめたい!ということを教えてください!
-
歳とったな〜〜と思ったことは?
歳とったな〜〜〜、老いたな〜〜と思った具体的な瞬間はありますか?
-
コンビニでおにぎりを買うときのスタメンはどの具?
コンビニでおにぎりを買うとき、何の具材を選ぶことが多いですか?
-
あなたの人生で一番ピンチに陥った瞬間は?
これまでの人生で今振り返ると「あの時、1番ピンチだったなぁ...」という瞬間はありますか?
-
【お題】斜め上を行くスキー場にありがちなこと
運営も客も一流を通り越して斜め上を行くスキー場にありがちなことを教えて下さい。
-
アクセスのレポートでレコード数をカウントしたい
その他(データベース)
-
共有モードと排他モードとどちらで開けばいい?
Access(アクセス)
-
ACCESS クエリで重複データを最新の1件だけ表示
Access(アクセス)
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
MySQLやSQliteの中のデータ検索...
-
ビューのソートについて
-
Access(MDB)の複製(レプリケー...
-
VBAでSQLServerへのODBC接続
-
Access無いけど.mdbが見たい!
-
テーブルで一番古いレコードだ...
-
SQL文の結合(一対多)がわから...
-
【mysql : HTML】チェックボッ...
-
アクセス レコードセットを更...
-
MYSQLでコード番号を自動でつけ...
-
Accessのテーブルデータを一気...
-
このISAMでは、リンクテーブル・・
-
ACCESSで容量が50MBになった...
-
Accessのインポートについて(上...
-
構文エラー : 演算子がありませ...
-
SQL Server に画像を登録
-
結合テーブルでINSERTする方法...
-
Access昇順レコードを、5分割...
-
Oracleで上書きImportはできま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
Accessのテーブルデータを一気...
-
ビューのソートについて
-
テーブルで一番古いレコードだ...
-
Oracleで上書きImportはできま...
-
アクセス レコードセットを更...
-
このISAMでは、リンクテーブル・・
-
住所のDBテーブル、マスターの...
-
結合テーブルでINSERTする方法...
-
同一テーブルのデータを参照し...
-
マテリアライズドビューとスナ...
-
htmlコードで書かれた表にphpで...
-
accessでレコード更新直後の反...
-
IF NOT EXISTを使用するINSERT文
-
Access VBAからエクセルに出力...
-
ORA-01401が表示され、データが...
-
構文エラー : 演算子がありませ...
-
ERROR1062:Duplicate entry.......
-
ODBC接続で新しいレコードを追...
-
「クリップボードにコピーされ...
おすすめ情報