アクセス97のテーブルを直接いじれなくする方法はある?

このQ&Aのポイント
  • アクセス97のテーブルを直接いじれないようにする方法について考えています。
  • フォームでのデータの読み書きはできるが、テーブルを直接覗いてデータ変更したり、削除する人がいるため、問題が発生しています。
  • 現在の対策としては、MDEファイルにしてテーブルを隠していますが、解除されることもあるため、他の方法を模索しています。
回答を見る
  • ベストアンサー

アクセス97のテーブルを直接いじれなくしたい

アクセス97です。 NTにあるDBを複数人で共有して使用しております。 クライアントはWin-95とWin-2000です。 フォームでデータの読み書きはできるのですが、 ときどき、テーブルを直接覗いてデータ変更したり、削除する人が います。 更新日付が変わらなかったり、データが一部壊れたりして困っています。 テーブルのデータやクエリーやモジュールを直接いじれなくする方法は ないでしょうか? 現在、MDEファイルにしているので、フォームはいじれません。 表示オプションでテーブルは隠しモジュールにしています。 でも、知っている人は簡単に解除できますよね。 困った。 ワークグループをつくり、アクセス権を設定するのはやりたくありません。 以前、管理に多大の勢力を使った経験があるので。 何か簡単にテーブルやクエリーをいじれなくする方法はないでしょうか? よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • gadd3
  • ベストアンサー率46% (211/451)
回答No.5

またよく考えたら… データ用mdbとプログラム用mdbの両方に、データベースウィンドウが出ない設定にしてAllowBypassKeyをかけたらOKかも…。 だめかな・・・。

onakagoo
質問者

お礼

解除できました。あ~ビックリした。 でも、今度は新たな難問が。 データベースウィンドウが表示されていなくても、 ツールバーのところで右クリックして「ユーザー設定」で データベースウィンドウのボタンを表示することができます。 あ~困った。。。

onakagoo
質問者

補足

試験的にやって、自らハマッてしまいました! AllowBypassKeyでshiftキーを押してもデータベースウィンドウが 表示されないようになりました。 しかし、データベースウィンドウを再表示する方法が分からず 復旧不可能です!(涙) どうすればデータベースウィンドウが表示されるでしょうか?

その他の回答 (6)

  • gadd3
  • ベストアンサー率46% (211/451)
回答No.7

> 起動時の設定で、「既定のショートカットメニュー」をオンにして、 >「ツールバー/メニューの変更」をオフに設定すると、 >「ユーザー設定」も表示しないようにできましたのでバッチリ!です。 ↑やっと意味がわかりました。これは便利かもしんないですね。ある程度の自由が与えられますね。僕も勉強になりました。ありがとうございます。

onakagoo
質問者

補足

まず、基本的に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なのでパスワードを探られてしまうことはありません。 記述内容は上記ソースの逆になります。 これにより、次回起動時はすべての制限が解除された状態 で立ち上がります。

  • gadd3
  • ベストアンサー率46% (211/451)
回答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破損の時などにデータのインポート・エクスポートなどができなくなってしまって不便かもしれません。 めんどくさいですが、アクセス権限ごとにプログラムファイルを数種作れば、簡易的て手軽なセキュリティができそうですね(^^)。 以上、もしすでに解決されているならごめんなさい。

onakagoo
質問者

お礼

毎回、詳細なご説明本当にありがとうございます。 しかし、gadd3さんもお気づきのように比較的簡単な方法で 解決いたしました。 それも、すべてgadd3さんのご指摘があったおかげです。 本当にありがとうございました。

onakagoo
質問者

補足

失礼いたしました。 お返事の順番がわかり辛かったですよね。ごめんなさい。 でも、こちらのシステムでは投稿者の返信の機会が 2回まで(補足とお礼)しか許されないのでなかなか苦労します。 ちゃんと分かりやすくお返事すればよかったですよね。 すみませんでした。

  • gadd3
  • ベストアンサー率46% (211/451)
回答No.4

書き終わってから気が付きました。 プログラムファイル側でリンクテーブルを開かれたらおわりですね。 うう!恥ずかしい!さっきの(↓)は全部忘れてください。

onakagoo
質問者

お礼

鉄壁のプロテクトができました。 起動時の設定で、「既定のショートカットメニュー」をオンにして、 「ツールバー/メニューの変更」をオフに設定すると、 「ユーザー設定」も表示しないようにできましたので、 バッチリ!です。 ありがとうございました。 大変いいヒントをいただきました。 助かりました。

  • gadd3
  • ベストアンサー率46% (211/451)
回答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にしても良いと思います(が、慎重に動作確認してくださいね。) これでだめだったらごめんなさい。

  • taranko
  • ベストアンサー率21% (516/2403)
回答No.2

目くらましぐらいにしかならないかもしれませんが、右クリック→ プロパティーで隠しオブジェクトで見えなくなります。 見たいときはツール→オプション→表示の表示オプションの 隠しオブジェクトにチェックを入れれば見れます。 そこでまた隠しオブジェクト以外に変更もできます。

回答No.1

こんにちは、ats8181oyajiです そこまで管理されたいのでしたら アクセスのみの運用では無理(限界)ではないでしょうか。 簡単にユーザーコンピューティング(EUC)可能な環境とデータ保護は 相反することですもんね。 案としましては データベースはアクセス。プログラムの部分はVisualBasicで 作成すれば、保護という問題は解決です。 EUCの部分は、必要なデータをCSV吐き出しのような機能を組み込んで まったくデータとは切り離し、エクセルやローカルのアクセスで 編集してもらう。。。。 どっちにしてもアクセスだけで実現する方法は思いつきませんでした。 ごめんなさい。

関連するQ&A

  • アクセスのテーブルを隠す?

    他のアクセスDBを見たのですが、何故かテーブルが空っぽでクエリー、フォーム、レポート等だけが見えます。 これってどうなっているおでしょうか? また、表示させることできるのでしょうか? よろしくお願いします。

  • Access 読み取り専用のアカウントでは開かない

    Access2003 サーバーPC OS:WinXP Pro アカウント名:suzuki, tanakaが登録してある 共有フォルダ:営業資料 DB名:顧客データ.mdb クライアントPC1 OS:Win7 Home アカウント名:suzuki DB名:顧客.mdb クライアントPC2 OS:XP Home アカウント名:tanaka DB名:顧客.mdb 顧客データ.mdbはテーブルのみ 顧客.mdbはフォーム、クエリ等があり、顧客データのテーブルにリンクを貼っています。 共有フォルダ「営業資料」には アクセス可能ユーザーに「suzuki」、「tanaka」を設定しました。 共有のアクセス許可でsuzukiは「フルコントロール」設定を、tanakaは「読み取り」のみ設定をしています。 この時クライアントPC1では顧客データに読み書きできますが、 クライアントPC2からアクセスすると、「顧客データ.mdbは既に使用されているので、使用できませんでした」 メッセージが表示されます。 共有のアクセス許可を「フルコントロール」に設定すれば読み書きできます。 クライアントPC2から「読み取りのみ」でアクセスすることはできますか? 宜しくお願いします。

  • ACCESSのテーブルロックについて

    テーブルのロックについて教えて下さい。 ACCESS2000にてテーブル作成クエリを作成し、その作成したテーブルをフォームで参照しています。 そのフォームを開いたままで、再度、同じテーブル作成クエリを実行すると、 「テーブル○○は現在ほかのユーザまたはプロセスで使用されているので、ロックできませんでした。」 というメッセージが表示され、クエリを完了することができません・・・ これを回避する(クエリを優先する)方法、設定があったら教えて下さい。 宜しくお願いします。

  • ACCESS 不要なオブジェクトの削除

    お尋ねします。 ACCESS初心者です。 OSはXPのPRO、ACCESSは2003を使っています。 いろいろ試行錯誤しながらDBを作成しているうち、テーブルやクエリなどのオブジェクトがかなりたまってしまいました。 パフィーマンスを上げるため、DBを整理して不要なオブジェクトを削除したいのですが、分析方法がわかりません。 テーブルとクエリはリレーションを見ればつながりがわかるのですが、フォームやレポートなどはひとつひとつデータソースを調べるしかないのでしょうか? どなたか教えてください。

  • Accessのフォームとテーブルについて教えてください。

    Access2003を使用しています。 既存のフォームAにフィールド3個を増やしました。 フォームAはテーブル(1)と連動していました。 追加したフィールドはテーブル(6)のものです。 ところがフォーム上で追加フィールドに入力が出来なくなりました。3フィールドのうち、ひとつはコンボボックスです。表示はされますが確定ができません。 フォームAのSQLステートメントではテーブル(1)・(6)以外にテーブル(2)・(3)・(4)・(5)が結合されています。 フォームAからするとテーブル(2)・(3)・(4)・(5)のデータはIDの名称を見るための参照用です。 テーブル(6)は、追加フィールドのコンボボックスが参照用で、他の2追加フィールドは、フォームから入力してテーブル(6)に反映させたいものです。 テーブル(6)の画面では入力できます。 フォーム上からは入力できません。 設定が何か欠けているからでしょうか? 他の質問では2つのテーブルをひとつのフォームにする場合は、クエリを別に設けた方がいいとなっています。フォームが出来上がっているので、できればクエリを設けずに行いたいのですが、よくない方法でしょうか? 手順なども踏まえて教えていただけると助かります。 よろしくお願いいたします。

  • Access2002でSQLSERVERに接続

    Access2002でSQLSERVERに接続してデータを参照しクエリを実行して個別集計したいのですが、こっそり接続したいので方法を教えてください。 目的:Accessを開いたら、設定したSQLSERVERのテーブルがクエリ実行されて希望の集計結果が表示されるようにしたい(権限は参照)。テーブル設定情報はクライアントに見せない(セキュリティの為) 近所の書店ではあまり参考になる本がなかったので検索した情報をもとに下記方法で接続してみることにしました。 (1)標準モジュールを設定  Sub DB接続() dim adocon as New ADODB.Connection adocon.Open "Deiver={SQL Server}; server=サーバー名; database=DB名; uid=ID; pwd=パス;" cn.Open end sub (2)マクロにてAutoExecを作成   プロシージャーの実行でAutoExecを設定し、モジュールにはAutoEXEC()にて   Call DB接続を設定しました。 しかしこれではうまく接続できたのかどうかも動作確認できません。また(2)の処理後に select * from テーブル名 のクエリを実行するように設定しても、テーブルがないと メッセージが表示されるので、うまく動作できてないようです。 クエリにて 「select * from [odbc;Driver={SQL Server}; Server=サーバー名; uid=ID;database=DB名;].テーブル名;」では接続してSQLSERVERのテーブル情報が見れます。なので名前などの間違いではないようです。(Accessの知識不足ですが、一つしかテーブルが参照できなく、複数のテーブルから色々条件を設定してデータ抽出ができないので使えないと判断しました) モジュールやマクロを利用してSQLSERVERからデータを参照するコマンド・方法を教えてください。

  • Access97をAccess2002にするには

    Access97で作成したmdb(オブジェクトは、テーブル(リンクテーブル有り)、クエリ、フォーム、レポート、マクロ(AutoExecのみ)、モジュールを使用)をAccess2002へ移行させようと思うのですが、単純に[ツール]→[データベースユーティリティ]→[データベースの変換]で良いものでしょうか。 もし、何か気をつけなければならないこと、やらなければならないこと等、または変換方法等をご教授いただけないでしょうか。

  • ACCESSのテーブルでデザインについて

    環境:サーバWin2003、クライアントXP11台、サーバを含めすべてACCESS2003 現在サーバWin2003でワークグループを組み、クライアントXP11台でサーバ内のACCESS2003にリンクを貼って使っています。 テーブルのデザインを変えたいのですが、すべてのクライアントを止めずにサーバ内のリンクされているテーブルをデザインする方法はありますか。

  • EXCELデータをリンクテーブルとしてACCESSで使う・・・・

    初心者ですが、よろしくお願いいたします。 顧客のデータをEXCELで管理しておりますが、ACCESSでの管理に変更します。そこで、ACCESSでの基盤となるデータなのですが、EXCELで入力して、それを毎日ACCESSのテーブルに引っ張ってくる方法をとりたいのです。過去のデータから現在のデータまで必要です。その方法なのですが、 (1)EXCELのデータをリンクしてリンクテーブルを作成。それをもとにフォームやレポートを作成・・・。 (2)削除クエリで前日の基盤のデータを丸ごと全部消してしまい、追加クエリで新データを丸ごと追加する。 ・・・と自分なりに2つの方法を考えたのですが、経験不足の為、これがベストの方法かよく分かりません。 みなさんは単純にEXCELのデータをACCESSのテーブルに毎日データを更新していくときはどのような方法をとっているのでしょうか。なにかスマートなやり方ありますでしょうか・・・。 よきアドバイスよろしくお願いいたします。

  • access2000・・テーブルをデーターシートビューで開くことができません

    お世話になっております。 access2000でとあるデータのテーブルを開こうとしたら 「テーブルをデーターシートビューで開けません」という メッセージが出てきました。 クエリやフォームは開くのですが、何故かテーブルのみこういったことになります。 何分accessをさっぱり解っていないので、どうすればいいかわかりません。 原因と解決策をご存知の方、お手数ですが宜しくお願い致します! 原因だけでも知りたいのです!