質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.93%

起動時にリンクテーブルを作成する

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 301

access

score 8

Accessによるヒヤリハット入力ツールを作成しています。

[前提]
この入力ツールは、テーブルのみのバックエンドファイルと、テーブル以外のフロントエンドファイルに分割し、フロントエンドファイル(accde)を利用者に配布する予定です。
(フロントエンドファイルのテーブルはバックエンドとリンクファイルにする)

[やりたいこと]
入力されたデータを格納するテーブルが存在するのですが、それを利用者に見られたくありません。

[試したこと]
・リボンやナビゲーションウィンドウを隠す
ファイルをShift押しながら開かれると見られるので×
・隠しテーブルにする
ファイルをShift押しながら開かれると見られるので×
・accdeとして保存
ファイルをShift押しながら開かれると見られるので×

・フロントエンドファイルを開く時、バックエンドファイルへのリンクテーブルを作成
これが今回質問したいこと。

[質問]
フロントにあらかじめリンクテーブルを設定しておくのではなく、フロントを開くときにバックへのリンクテーブルを作成し、DBを閉じるときにリンクテーブルを削除すれば安全ではないかと思いました。
以下の手順を試したところ、バックのリンクテーブルの作成にはならず、テーブルをそのままコピーしているようです。どこかが間違っているのでしょうか。

DoCmd.TransferDatabase acImport, "ODBC", _ 
"MS Access;DATABASE=C:\DBProtectBackEnd.ACCDB;PWD=password;", _ 
acTable, "Tヒヤリハット","Tヒヤリハット"

今回のようにフロントとバックにファイルを分けて運用するとき、「テーブルの中身を見られたくない」という状況はよく発生すると思います。
それを実現する定番の方法みたいなものはあるのでしょうか。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

どの程度のセキュリティが必要かにもよりますが、

起動時にリンクテーブルを作成する
閉じる時にリンクテーブルを削除する

さらに、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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/15 22:44

    >>この方法の場合は、DlookupやDcountは使えませんね。
    やはりそうでしたか・・・調べても出てこないはずでした。

    最初の設計が甘くセキュリティ面で八方塞がりになってしまいした。
    今検討している運用をまた質問させて頂きます。
    これがダメならすべてをDAOで書き換えます。

    有難うございました!

    キャンセル

  • 2020/07/15 23:37

    DlookupやDcountと同等の仕様の関数を作成して、例えば、MyDLookup MyDCount という名前にしておいて、VBAエディタの置換すれば、それほど手間でないと思います。

    キャンセル

  • 2020/07/16 00:04

    MyDLookup MyDCount関数、サクッと作成しましたので、回答に追記しておきます。

    キャンセル

0

DoCmd.TransferDatabase acImport

DoCmd.TransferDatabase acLink
にするだけで上手くいきました。
有難うございます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

Shift開きできるってことはプログラム触れるAccess本体ってことだからまず
『「accde」で公開する』

は必須。(ファイルのプロパティいじってShift開きできなくすることもできるけどね…)

次にテーブルを見えなくする方法だけど…accdbファイルで実用的なのはあんまりしらない。
SQLServer使ってWindows認証したほうが確実になるんじゃない?

フロント側でなんとか押せるかもしれんけどそれで開発効率落ちたらAccessの強みが減る気がする。
自分ならある程度諦めます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/13 19:00

    有難うございます。
    >>SQLServer使ってWindows認証したほうが確実になるんじゃない
    この辺りはレベルが違いすぎてたぶん理解不能です・・・
    0知識から勉強できる本などありましたら紹介頂けると幸いです。

    キャンセル

  • 2020/07/15 09:35

    0知識だと正直きつい。AccessからSQLServerとODBC接続できるようになってからの話になります。
    本とかはわかりません、私はネットで集めてます。
    今のAccess使っている方は存じ上げないと思いますがAccess2010のバージョンまで
    SQLServerと親和性の高い「Accessプロジェクト(.adp)」っていうファイルが作れました。
    なのでSQLServerはそこそこ調べる機会があったんですよね…

    キャンセル

  • 2020/07/15 22:33

    なるほど・・・
    サーバー系の学習もしなければならないと思いつつ、初心者本が見つからない為あきらめておりました。

    キャンセル

  • 2020/07/15 22:59

    AccessはSQLServer使うとなると書籍はあまりないと思います。
    気が早い話になりますがvbaでのODBC接続に慣れれば、クエリなどはDBMS側で一括管理できたりするのでvbaにある程度なれたら勉強する気があればaccessのSQLは忘れてSQLServer触ってもいいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る