ここから本文です

マイクロソフトACCESSにログを残したい

hay********さん

2008/11/2414:23:50

マイクロソフトACCESSにログを残したい

MicrosoftAccessを使用してデータ管理していますが、データが改竄される事件がありました。
改竄を防止するために、ログ取りを設定したいのですが、誰か教えてください。

いつ、だれが、そのデータを書き込んだのか、が解れば充分です。

会社のイントラネット内ですが、100人以下の職場です。犯人はだいたい分かっていますが、決定的な証拠がありません。
ログを調べられれば、ある程度の抑止力になると考えています。

ご協力をお願いします。

補足MOS試験Accessに合格しています。VBAエキスパートはExcel2002standardに合格したレベルです。

問題のデータベースはAccess98です。Office2003が標準の会社ですが、それ自体は古いもので、何度も改良している様子です。

今のところ、入力後、プリントスクリーンで画面撮りして、Excelに画像を貼り付けて,記録している状況です。犯人は判っていますが、決定的な証拠はありません。

こんな状況ですが、ご意見をお待ちしています。

閲覧数:
14,620
回答数:
4
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

アバター

ID非公開さん

2008/11/2920:57:11

フォームから操作はできるが
それ以外は受け付けないなら方法があります
ユーザ名 PC名 時間 操作 を記録することができます

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

hat********さん

2008/11/2423:36:49

Accessでは、テーブルやクエリで直接操作した場合は、制御したりログを残すことはできません。
ですので、まずは生のデータ(テーブル)を直接ユーザーに見せない。参照、入力は必ずフォームからしか出来ないように設計する必用があります。

現状のどのように運用しているのか情報がありませんが、とりあえず下記のような設計にすればAccessでもかなり安全性は
高くなるでしょう。

サーバーにはデータの入ったテーブルだけのMDBファイルを置く。
(バックエンドMDB)

各PCには、その他のオブジェクト(フォーム、レポート、モジュール)のファイルを置く。これはMDEファイルにして、デザインを変更できないようにしておく。(フロントエンドMDE)

バックエンドMDBには、データベースバスワードを設定しておきます。これで、パスワードを知っている人しか生のデータ(テーブル)を見ることはできなくなります。

フロントエンドMDEには、リンクテーブルやクエリを置くと、生のデータを見られますので置きません。フォームのレコードソースプロパティにSQLを直接記述します。バックエンドMDBのテーブルは、IN句で参照します。

C:\バックエンド.mdb の テーブル1 を読み込む場合のSQL例
(パスワードは 9999)

SELECT テーブル1.*
FROM テーブル1 IN '' [MS Access;DATABASE=C:\バックエンド.mdb;PWD=9999;];

このSQLは、デザインビューで開かないと見れませんが、MDEならデザインビューで見ることはできません。

これで、パスワードを知る人以外はフォームからデータを見たり、更新したりは出来なくなります。

フォームでなら、更新前処理などで、不正なデータは拒否したり、更新日時、ユーザー名等を記録することもできます。

ただ、Accessの場合、どうしても限界があります。
サーバーに何台の端末がぶら下がっているのか解りませんが、せいぜい、一桁台の同時接続数ぐらいまでしか安定した運用は難しいと思います。

本格的に、セキュリティ、安定性を求めるなら、SQL Server 等のRDBMSにアップサイズすることを検討すべきでしょう。

rim********さん

2008/11/2418:18:39

フォームからだけ 入力 修正 削除 ができるなら
イベントをひろってログを保存できます
ユーザ名 PC名を 保存できます
足りないときは ID PASS を使ってログインさせるなら
その情報も記録できます

まず最初に きちんと「保護」してください
決まった操作しかできないなら 警報機を仕掛けることができます
何でもあり の状況では 管理の方法がありません
どこまで 保護 しているでしょうか
どういう情報を記録したいでしょうか
詳しく教えて下さい

rev********さん

編集あり2008/11/2523:35:33

7~8年前に私もその問題で困り果てました。
Access単体で運用している以上は解決方法はありません。

たまに数年に一度くらいの割合で仕事でAccessでデータベースを作らされる事がありますが
その時は 「フォルダ監視」と言う無償ソフトを使って共有フォルダへのAccessログを取る事にしています。

それでもAccessファイルにアクセスした記録しか取れませんので
昼間のアクセス頻繁な時間帯に改竄されたら手に負えません。

私が運用した一番良い方法は
テーブルをコッソリと SQL Serverのリンクテーブルにしてしまい、
UPDATEトリガや DELETEトリガでログを取ってしまうことでした。

UPDATE時にはDELETE テーブルの臨時テーブルに格納されますが
改竄されたデータ、ユーザー名、タイムスタンプなどの取り方などは
下記のURLのサンプルを参考にされると良いと思います。

http://blogs.sqlpassj.org/yoshihirokawabata/articles/7527.aspx

(上記サンプルでは INSERT INTO [dbo].[T_A_H] とある所はエラーになるので
INSERT INTO [dbo].[T_A_H] (列名1, 列名2,…) と明示的にINSERT先列名の指定が必要です)

ストアドなどでログテーブルへINSERT処理すればもっと効率的にログできると思いますので
サンプルをまずそのままテストしてから効率化を試してみてください。

詳しい方法は別袋で質問するか
この回答を見たコバンザメ回答者の詳細回答をお待ち下さい。

[追記]

> MOS試験Accessに合格しています。
> VBAエキスパートはExcel2002standardに合格したレベルです。

申し訳ありません。
リンクテーブルですら作れないでしょうから SQL Server でトリガとストアドなど提案しても無意味でした(笑)

前回も申し上げた通り、Access単体では十分なセキュリティの確保には数十もあるステップが必要となります。
MOS、VBA-E の資格レベルでは、そこそこの防御しか出来ず
外から Accessに長けた派遣の人などが来た途端に全て破られてしまう可能性もあります。

とりあえずのレベルと言う前提で話すと

まずはユーザー名とタイムスタンプを保存するテーブルを作ります。

次にそのテーブルにユーザー名と時間を保存するクエリを作ります。

ユーザー名は GetUserName と言う Win32 API関数でWindowsドメインログイン時の名前が取得可能です。
VBAを書く必要が出てきます。
サンプルは下記のURLを参考にしてください。
http://www.accessclub.jp/samplefile/samplefile_228.htm

作った関数を追加クエリにユーザー定義関数として実装すれば
ユーザー名をログテーブルに保存する事が可能です。
ちなみにPCのマシン名も GetComputerName と言うWin32 API関数で取得可能です。

クエリ上にユーザー定義関数を作成しログ用テーブルに追加するように設定したら
そのクエリを、ログイン用のフォームを作って、ボタンに組み込むなり
レコード保存のボタンのクリックのイベントプロシージャに組み込むなりしてください。

テーブルを直接編集するのを防ぐのにテーブルを隠すのも良いでしょう。
Attributes プロパティをVBAで設定して隠してください。
下記のURLを参考にしてください。

http://www.accessclub.jp/bbs/0028/beginers12417.html


勿論 ログテーブルを隠すのも忘れずに。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる