Windows7でAccessデータベースを使ったシステムを開発してる時に起こった出来事。
指定パスにあるデータベース(mdbファイル)を別アプリで開いてUPDATEする。
データベースを開いている時に指定パスを見ると、ldbファイルが出来ているので間違いなくそのパスで開いている。
で、UPDATEした内容を確認しようと指定パスのmdbファイルを確認すると反映されていない!
しかし、もう一度アプリから開いてSELECTしてみると、UPDATEされている。
まったく分からん!
と湯○教授ごっこしながら、あれやこれや調べつつ、最終的にmdbファイル名でファイル検索して実体ファイルを突き止めた!
VirtualStore という謎エリア
mdbファイル名でファイル検索かけたら、見慣れないパスにファイルが存在していた。
C:\Users\[ユーザー名]\AppData\Local\VirtualStore
この下にデータベースが入っているフォルダが作成されてその中に問題のmdbファイルが存在していた。
内容を確認するに、アプリから更新されてたのはこのファイルだった。
VirtualStoreって何者?
Google先生に聞いてみたところ、以下のような答えが返ってきた。
権限の持ってないフォルダ/ファイルへの変更をした場合、OSが自動で代替ファイルを作り、そちらで処理を実行。 処理自体は正常を返し、以降は代替ファイルに書き込むを行う。
つまりOSの保護システム的なものらしい。
なので解決方法としては2通りある。
指定パスのアクセス権を変更するか、VirtualStoreを無効にするか、だ。
以下に、VirtualStore機能をオフする方法を書いておく。
VirtualStoreを無効にする
「コントロールパネル」→「管理ツール」→「ローカル セキュリティ ポリシー」→「セキュリティの設定」→「ローカル ポリシー」→「セキュリティ オプション」→「ユーザー アカウント制御:各ユーザの場所へのファイルまたはレジストリの書き込みエラーを仮想化する」を「無効」にする
(上記で出来ない場合)
レジストリエディタで直接無効化する。
「ファイル名で実行」に「regedit」と入力してレジストリエディタを起動。以下のキーの値を変更する。
- キー :[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
- 値:[EnableVirtualization]=(1:有効、0:無効)
単純にユーザー側から見ると混乱する元でしかないから、こういうのやめて欲しいなぁ…。