質問: Accessによるヒヤリハット入力ツールを作成しています。 [前提] この入力ツールは、テーブルのみのバックエンドファイルと、テーブル以外のフロントエンドファイルに分割し、フロントエンドファイル(accde)を利用者に配布する予定です。 (フロントエンドファイルのテーブルはバックエンドとリンクファイルにする) [やりたいこと] 入力されたデータを格納するテーブルが存在するのですが、それを利用者に見られたくありません。 [試したこと] ・リボンやナビゲーションウィンドウを隠す ファイルをShift押しながら開かれると見られるので× ・隠しテーブルにする ファイルをShift押しながら開かれると見られるので× ・accdeとして保存 ファイルをShift押しながら開かれると見られるので× ・フロントエンドファイルを開く時、バックエンドファイルへのリンクテーブルを作成 これが今回質問したいこと。 [質問] フロントにあらかじめリンクテーブルを設定しておくのではなく、フロントを開くときにバックへのリンクテーブルを作成し、DBを閉じるときにリンクテーブルを削除すれば安全ではないかと思いました。 以下の手順を試したところ、バックのリンクテーブルの作成にはならず、テーブルをそのままコピーしているようです。どこかが間違っているのでしょうか。 DoCmd.TransferDatabase acImport, "ODBC", _ "MS Access;DATABASE=C:\DBProtectBackEnd.ACCDB;PWD=password;", _ acTable, "Tヒヤリハット","Tヒヤリハット" 今回のようにフロントとバックにファイルを分けて運用するとき、「テーブルの中身を見られたくない」という状況はよく発生すると思います。 それを実現する定番の方法みたいなものはあるのでしょうか。
回答: どの程度のセキュリティが必要かにもよりますが、 起動時にリンクテーブルを作成する 閉じる時にリンクテーブルを削除する さらに、accde にしておく、リボン、ナビゲーションウィンドウ非表示を組み合わせるというのもそれなり安全ではありますが、 例えば、フリーズしたり、強制終了など、正常に終了しなかった場合、リンクテーブルが残る場合があります。そうすると、その後、Shift起動するとテーブルデータをみられる可能性が残ります。 下記で紹介している方法だとリンクテーブルは使用しないので、上記よりは安全です。 テーブルデータを保護する - hatena chips 外部データベース用のDCount関数、DLookup関数 DCount関数、DLookup関数とまったく同じ仕様なので、 下記のコードを標準モジュールにコピーして、 VBAエディターで DCount を MyDCount に置換、DLookup を MyDLoouup に置換するだけです。 ``` Option Compare Database Option Explicit Const Inku = " IN '' [Ms Access;PWD=1234;DATABASE=C:\DBProtectBackEnd.ACCDB;]" '外部データベース接続文字列 Public Function MyDCount(Expr As String, Domain As String, Optional Criteria As String) Dim strSQL As String strSQL = "SELECT Count(" & Expr & ") FROM " & Domain & Inku If Criteria <> "" Then strSQL = strSQL & " WHERE " & Criteria End If Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenForwardOnly, dbReadOnly) MyDCount = rs(0) End Function Public Function MyDLookup(Expr As String, Domain As String, Optional Criteria As String) Dim strSQL As String strSQL = "SELECT " & Expr & " FROM " & Domain ' & Inku If Criteria <> "" Then strSQL = strSQL & " WHERE " & Criteria End If Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenForwardOnly, dbReadOnly) MyDLookup = rs(0) End Function ```