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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

3115閲覧

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

access

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/07/12 06:19

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

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

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

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

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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

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

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

投稿2020/07/12 12:11

sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

access

2020/07/13 10:00

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

2020/07/15 00:35

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

2020/07/15 13:33

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

2020/07/15 13:59

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

0

ベストアンサー

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

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

さらに、accde にしておく、リボン、ナビゲーションウィンドウ非表示を組み合わせるというのもそれなり安全ではありますが、
例えば、フリーズしたり、強制終了など、正常に終了しなかった場合、リンクテーブルが残る場合があります。そうすると、その後、Shift起動するとテーブルデータをみられる可能性が残ります。

下記で紹介している方法だとリンクテーブルは使用しないので、上記よりは安全です。

テーブルデータを保護する - hatena chips


外部データベース用のDCount関数、DLookup関数

DCount関数、DLookup関数とまったく同じ仕様なので、
下記のコードを標準モジュールにコピーして、
VBAエディターで DCount を MyDCount に置換、DLookup を MyDLoouup に置換するだけです。

vba

1Option Compare Database 2Option Explicit 3Const Inku = " IN '' [Ms Access;PWD=1234;DATABASE=C:\DBProtectBackEnd.ACCDB;]" '外部データベース接続文字列 4 5Public Function MyDCount(Expr As String, Domain As String, Optional Criteria As String) 6 Dim strSQL As String 7 strSQL = "SELECT Count(" & Expr & ") FROM " & Domain & Inku 8 If Criteria <> "" Then 9 strSQL = strSQL & " WHERE " & Criteria 10 End If 11 12 Dim rs As DAO.Recordset 13 Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenForwardOnly, dbReadOnly) 14 15 MyDCount = rs(0) 16End Function 17 18Public Function MyDLookup(Expr As String, Domain As String, Optional Criteria As String) 19 Dim strSQL As String 20 strSQL = "SELECT " & Expr & " FROM " & Domain ' & Inku 21 If Criteria <> "" Then 22 strSQL = strSQL & " WHERE " & Criteria 23 End If 24 25 Dim rs As DAO.Recordset 26 Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenForwardOnly, dbReadOnly) 27 28 MyDLookup = rs(0) 29End Function

投稿2020/07/12 08:51

編集2020/07/15 15:10
hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

access

2020/07/12 09:05

有難うございます。 異常終了後のshift開きは盲点でした。 リンク先は私も行き着いたのですが、SQL文がSelectしか掲載されていなかったもので諦めておりました。(実際はコードでInsertやUpdateもDeleteも行うので)
hatena19

2020/07/12 10:02 編集

InsertやUpdateもDeleteもSELECTと同様に、IN句接続は可能です。 あるいは、DAOかADOでDatabaseオプジェクトとして開けば、IN句を使わずに通常のSQLで実行できます。
access

2020/07/12 12:28

有難うございます。 素人目ではテーブルを見えないようにするなんて簡単なことだと思ってましたが、Access側にそういう機能が準備されていないとは驚きました。 今からSQLにin句を加えるか(Docomd.RunSQLでやっているので)、DAOレコードセットに変更するか検討してみます。
access

2020/07/13 09:58

重ねての質問で恐縮です。 フロントエンドからバックエンド(パス付)のテーブルへDlookupやDcount関数でアクセスすることは可能でしょうか。 DlookupやDcountで参照しているコードもあり、それが無理なら全てDAOレコードセットで書き換えようと思います。
hatena19

2020/07/14 04:21

この方法の場合は、DlookupやDcountは使えませんね。 フォームで表示されているデータのカウントなら、Count関数を使うと簡単に取得できます。 例えば、フォームヘッダーかフッターにテキストボックスを配置して、 =Count(*) とすれば全件数が取得できますし、 =Sum(IIf(抽出条件式,1,0)) とすれば上限に合致した件数を取得できます。 =Count(*)
access

2020/07/15 13:44

>>この方法の場合は、DlookupやDcountは使えませんね。 やはりそうでしたか・・・調べても出てこないはずでした。 最初の設計が甘くセキュリティ面で八方塞がりになってしまいした。 今検討している運用をまた質問させて頂きます。 これがダメならすべてをDAOで書き換えます。 有難うございました!
hatena19

2020/07/15 14:37

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

2020/07/15 15:04

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

0

DoCmd.TransferDatabase acImport

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

投稿2020/07/12 07:40

access

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問