アクセス97です。
NTにあるDBを複数人で共有して使用しております。
クライアントはWin-95とWin-2000です。
フォームでデータの読み書きはできるのですが、
ときどき、テーブルを直接覗いてデータ変更したり、削除する人が
います。
更新日付が変わらなかったり、データが一部壊れたりして困っています。
テーブルのデータやクエリーやモジュールを直接いじれなくする方法は
ないでしょうか?
現在、MDEファイルにしているので、フォームはいじれません。
表示オプションでテーブルは隠しモジュールにしています。
でも、知っている人は簡単に解除できますよね。
困った。
ワークグループをつくり、アクセス権を設定するのはやりたくありません。
以前、管理に多大の勢力を使った経験があるので。
何か簡単にテーブルやクエリーをいじれなくする方法はないでしょうか?
よろしくお願い致します。
No.5ベストアンサー
- 回答日時:
またよく考えたら…
データ用mdbとプログラム用mdbの両方に、データベースウィンドウが出ない設定にしてAllowBypassKeyをかけたらOKかも…。
だめかな・・・。
この回答への補足
試験的にやって、自らハマッてしまいました!
AllowBypassKeyでshiftキーを押してもデータベースウィンドウが
表示されないようになりました。
しかし、データベースウィンドウを再表示する方法が分からず
復旧不可能です!(涙)
どうすればデータベースウィンドウが表示されるでしょうか?
解除できました。あ~ビックリした。
でも、今度は新たな難問が。
データベースウィンドウが表示されていなくても、
ツールバーのところで右クリックして「ユーザー設定」で
データベースウィンドウのボタンを表示することができます。
あ~困った。。。
No.7
- 回答日時:
> 起動時の設定で、「既定のショートカットメニュー」をオンにして、
>「ツールバー/メニューの変更」をオフに設定すると、
>「ユーザー設定」も表示しないようにできましたのでバッチリ!です。
↑やっと意味がわかりました。これは便利かもしんないですね。ある程度の自由が与えられますね。僕も勉強になりました。ありがとうございます。
この回答への補足
まず、基本的にMDEで作成しソースを非公開とします。
制限の設定:
MDE起動時にautoexecで指定したモジュールで以下の設定を走らせます。
===
ChangeProperty "StartupShowDBWindow", dbBoolean, False
ChangeProperty "StartupShowStatusBar", dbBoolean, True
ChangeProperty "AllowBuiltinToolbars", dbBoolean, False
ChangeProperty "AllowFullMenus", dbBoolean, False
ChangeProperty "AllowBreakIntoCode", dbBoolean, True
ChangeProperty "AllowSpecialKeys", dbBoolean, False
ChangeProperty "Allowtoolbarchanges", dbBoolean, False
ChangeProperty "AllowBypassKey", dbBoolean, False
===
これで、次回起動時から鉄壁の制限がかかります。
Shiftキーを押しながら起動してもこの制限は破れません。
制限の解除方法:
メインメニューには、上記制限を解除するボタンを付けておきます。
このボタンはもちろんパスワードを入力しないと実行しないように
VBAで仕掛けておきます。
MDEなのでパスワードを探られてしまうことはありません。
記述内容は上記ソースの逆になります。
これにより、次回起動時はすべての制限が解除された状態
で立ち上がります。
No.6
- 回答日時:
onakagooさんの「お礼」等の順番とかが良くわからなかったので、まだ解決していないものとしてまた書きますね。
(上から順番いn「お礼」を読むとすでに解決されているようですが…(^^))あれから自分もやってみました。
考え方としては、以下のようなかたちです。
・パスワードを入力するフォームを作成
・パスワードを2種類用意
ユーザー用のメインフォームを開くためのパスワードと、
Shiftキーを無効化/無効化解除フォームを開くためのものを2つ。
・Shiftキーを無効化/無効化解除するためのフォームを作成
コマンドボタンを2つ作り、それぞれでShiftキーを無効化/無効化解除
できるようにする
・起動時の設定では、オリジナルメニューバーか最低限のメニューしか
表示されないようにする。
また、最初にパスワード入力フォームが表示されるようにする。
・パスワード入力フォームの更新後処理イベントに
ユーザー用メインフォームがオープンする処理とShiftキー無効化/解除フォーム
がオープンする処理とをパスワードで分岐させるif文を書く。
どちらにも当てはまらないならAccessを閉じる処理を書く
具体的には以下のような感じでやりました。Access2000+Win98(無印)の環境なので、あてはまらないことがあったらごめんなさい。
(1)起動時の設定で、ステータスバー以外のメニュー表示がされないようにする。
具体的には以下。
・アプリケーションタイトル…入力なし
・アプリケーションアイコン…入力なし
・メニューバー既定の設定…アプリ用専用ツールバーの名前を指定
・すべてのメニューを表示する…OFF
・既定のショートカットメニュー…OFF
・フォーム/ページの表示…パスワード入力用のフォーム名を指定
・データベースウィンドウの表示…OFF
・ステータスバーの表示…ON
・ショートカットメニューバー…(既定の設定)
・組み込みツールバー…OFF
・ツールバー/メニューの変更…OFF
(2)起動時にオープンするパスワード入力用フォームのプロパティ設定
・スクロールバー…なし
・レコードセレクタ…いいえ
・移動ボタン…いいえ
・区切り線…いいえ
・ポップアップ…はい
・境界線スタイル…ダイアログ
・最小化/最大化ボタン…なし
・閉じるボタン…はい
(3)Shiftキー無効化/解除フォームのプロパティ
同上
(4)Shiftキー無効化/解除フォームのコマンドボタンを作成
2つ作ります。
●Shiftキー無効化解除のコマンドボタンのクリックイベントのコード
Const DB_Boolean As Long = 1
ChangeProperty "AllowBypassKey", DB_Boolean, True
Quit
●Shiftキー無効化のコマンドボタンのクリックイベントのコード
Const DB_Boolean As Long = 1
ChangeProperty "AllowBypassKey", DB_Boolean, False
Quit
(5)起動時にオープンするパスワード入力用フォームの更新後処理イベントに
以下のように記述。パスワードが「123456」だったらユーザー用フォームを開き、
「789」だったらShiftキー無効化/解除フォームを開くようにする。
どちらにも当てはまらないならAccess終了。
If Me!txtbox1 = "123456" Then
DoCmd.OpenForm "ユーザー用メインフォーム名"
DoCmd.Close acForm, "パスワード入力フォーム名", acSaveYes
ElseIf Me!txtbox1 = "789" Then
DoCmd.OpenForm "Shiftキー無効化/解除フォーム名"
Else
Quit
End If
(6)標準モジュールに前回のFunctionプロシージャのコードを貼り付けておく
以上で、どこを右クリックしても何も出てきませんでした。
起動時の設定を1つずつONにしても大丈夫でした。
なお、この方法だと、外部からDAOやADOでアクセスしてくる場合は防げませんが、でも、テーブルの直接書き換えを防ぐだけなら有効のように思います。
逆にDAOやADOでアクセスを制限すると、mdb破損の時などにデータのインポート・エクスポートなどができなくなってしまって不便かもしれません。
めんどくさいですが、アクセス権限ごとにプログラムファイルを数種作れば、簡易的て手軽なセキュリティができそうですね(^^)。
以上、もしすでに解決されているならごめんなさい。
この回答への補足
失礼いたしました。
お返事の順番がわかり辛かったですよね。ごめんなさい。
でも、こちらのシステムでは投稿者の返信の機会が
2回まで(補足とお礼)しか許されないのでなかなか苦労します。
ちゃんと分かりやすくお返事すればよかったですよね。
すみませんでした。
毎回、詳細なご説明本当にありがとうございます。
しかし、gadd3さんもお気づきのように比較的簡単な方法で
解決いたしました。
それも、すべてgadd3さんのご指摘があったおかげです。
本当にありがとうございました。
No.4
- 回答日時:
書き終わってから気が付きました。
プログラムファイル側でリンクテーブルを開かれたらおわりですね。
うう!恥ずかしい!さっきの(↓)は全部忘れてください。
鉄壁のプロテクトができました。
起動時の設定で、「既定のショートカットメニュー」をオンにして、
「ツールバー/メニューの変更」をオフに設定すると、
「ユーザー設定」も表示しないようにできましたので、
バッチリ!です。
ありがとうございました。
大変いいヒントをいただきました。
助かりました。
No.3
- 回答日時:
MDEのままじゃないといけませんか?
もしMDEからデータを書き出して、MDEを作ったもとのMDBに吸い込めるなら、mdbにデータを吸い込んだあと、テーブルとプログラム部分(フォーム、クエリ等)を分割して、適当なフォームを作ってパスワードを入力しないとmdbが開けないように設定したらどうでしょう?
(データの書き出しと吸い込み、テーブルとフォーム等の分割がとても面倒くさいですが…。ただ一回やってしまえばあとは楽チンだと思います。)
**********************
≪パスワード設定の方法≫
データ用mdb(テーブルのみのmdb)に「フォーム1」というフォームをつくり、そのなかにテキストボックス「txtbox1」を作ります。パスワードは「123456」だとします。
で、「txtbox1」の更新後処理に以下のように記述します。コピペでOKです。
If Me!txtbox1 = "123456" Then
DoCmd.Close acForm, "フォーム1", acSaveYes
Else
Quit
End If
これでパスワード「123456」を入力しないかぎり、データ用mdbは必ず閉じてしまいます。このフォームをAutoExecマクロか「起動時の設定」メニューで起動時に最初に開くようにします。
次にShiftキーを押しながらのファイルオープンを無効にします。
適当なモジュールに以下のコードをコピペして、Sub SetBypassProperty()のプロシージャを実行します。1度実行すればShiftキーを押しながらmdbを開いても起動時の設定が有効になったままです。データベースウィンドウが表示されない設定になっていれば表示されません。
解除するには、ChangeProperty "AllowBypassKey", DB_Boolean, False の行のFalseをTrueに書き換えて再度実行します。
Sub SetBypassProperty()
Const DB_Boolean As Long = 1
ChangeProperty "AllowBypassKey", DB_Boolean, False
End Sub
Function ChangeProperty(strPropName As String, varPropType As Variant, varPropValue As Variant) As Integer
Dim dbs As Object, prp As Variant
Const conPropNotFoundError = 3270
Set dbs = CurrentDb
On Error GoTo Change_Err
dbs.Properties(strPropName) = varPropValue
ChangeProperty = True
Change_Bye:
Exit Function
Change_Err:
If Err = conPropNotFoundError Then ' プロパティが見つかりません。
Set prp = dbs.CreateProperty(strPropName, _
varPropType, varPropValue)
dbs.Properties.Append prp
Resume Next
Else
' 認識できないエラー。
ChangeProperty = False
Resume Change_Bye
End If
End Function
これができたら一応mdbをバックアップしておきます。もちろんこれもパスワード「123456」を知らない限り、FalseをTrueに書き換えることはできません。
なお、mdeを作るとFalseをTrueに書き換えることができなくなってしまうので、データ用mdbはmdbのまま使います。プログラム用のmdbはたぶんですが、mdeにしても良いと思います(が、慎重に動作確認してくださいね。)
これでだめだったらごめんなさい。
No.2
- 回答日時:
目くらましぐらいにしかならないかもしれませんが、右クリック→
プロパティーで隠しオブジェクトで見えなくなります。
見たいときはツール→オプション→表示の表示オプションの
隠しオブジェクトにチェックを入れれば見れます。
そこでまた隠しオブジェクト以外に変更もできます。
No.1
- 回答日時:
こんにちは、ats8181oyajiです
そこまで管理されたいのでしたら
アクセスのみの運用では無理(限界)ではないでしょうか。
簡単にユーザーコンピューティング(EUC)可能な環境とデータ保護は
相反することですもんね。
案としましては
データベースはアクセス。プログラムの部分はVisualBasicで
作成すれば、保護という問題は解決です。
EUCの部分は、必要なデータをCSV吐き出しのような機能を組み込んで
まったくデータとは切り離し、エクセルやローカルのアクセスで
編集してもらう。。。。
どっちにしてもアクセスだけで実現する方法は思いつきませんでした。
ごめんなさい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessのフォーム上にレコード...
-
ACCESSで入力フォームをHTMLフ...
-
Access2002 フォームを閉じるた...
-
選択したチェックボックスのみ...
-
「メソッドまたはデータメンバ...
-
ACCESSのフォームからデータの...
-
accessの自動更新処理をできな...
-
オートシェイプのような作図入...
-
Accessで入力用全画面Formと検...
-
アクセス非連結フォームのテキ...
-
Accessのフォームで作業領域を...
-
Accessフォームのテキストボッ...
-
アクセスでテーブルの変更内容...
-
アクセス 0以外をカウントす...
-
アクセスのフォームのビューが...
-
アクセスでのVLOOKUPの代わりに...
-
ACCESSで、フォームのレコード...
-
Accessで現金出納簿を作りたい...
-
Access コマンドボタンクリッ...
-
[至急]accessクエリ結果を入力...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESSのフォームからデータの...
-
accessの自動更新処理をできな...
-
選択したチェックボックスのみ...
-
Accessのフォーム上にレコード...
-
アクセスのフォームのビューが...
-
ACCESSで入力フォームをHTMLフ...
-
アクセスでテーブルの変更内容...
-
アクセスでの項目追加について...
-
Access 別フォームへの再クエ...
-
「メソッドまたはデータメンバ...
-
アクセス 0以外をカウントす...
-
Access2002 フォームを閉じるた...
-
Accessフォームのテキストボッ...
-
帳票フォームに全レコードを表...
-
Accessのフォーム画面について
-
Accessのフォームに表示...
-
テキストボックス(アクセス)内...
-
Accessが不良です
-
Accessのフォームで作業領域を...
-
Access フォーム上でコンボボッ...
おすすめ情報