【入門編】QueryDefの実行権限を制御する:特定のユーザーのみが実行可能な「管理用クエリ」の隠蔽術 – Access VBA解析バイブル

スポンサーリンク

Access VBAの深淵へ:管理用クエリを「影」に隠す、プロのセキュリティ実装術

こんにちは。Accessという広大な海に挑む皆さんの航海をサポートするチーフアーキテクトです。

これまで「クエリ作成画面」にクエリを並べて管理していませんでしたか? それは便利ですが、誰でも中身が見られ、誰でも実行できてしまうという「セキュリティの穴」を放置していることと同じです。

今日は、「必要な時だけ生成し、終われば消し去る」という、プロフェッショナルなクエリ管理術を伝授します。これを使えば、管理用クエリを覗き見られるリスクから解放されますよ。

—

なぜ「QueryDef」で動的に制御するのか?

通常、Accessのクエリは「オブジェクト」として保存されます。しかし、機密性の高い処理(データの全削除や権限変更など)を永続的に保存しておくのは危険です。

そこで、DAO(Data Access Objects)の`QueryDef`オブジェクトを使います。
これは「メモリ上に一時的なクエリ定義を作成し、実行後に消滅させる」という、いわば「使い捨ての武器」を生成するような手法です。

この手法のメリット

1. 隠蔽性: 普段はクエリ一覧に存在しないため、一般ユーザーには何をしているか分からない。
2. 実行制御: コード内で「管理者権限があるか?」を判定し、クリアした者だけが生成プロセスを通れるように制限できる。

—

実装の極意:管理者限定「動的クエリ実行」コード

まずは、特定の条件(ここでは管理者ID)を満たした場合のみクエリを生成・実行するコードの骨組みを見てみましょう。

Public Sub ExecuteAdminQuery(strSQL As String, adminFlag As Boolean)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Const QRY_NAME = “temp_AdminTask” ‘ 一時クエリの名前

‘ 1. 管理者権限のチェック(ここが門番です)
If Not adminFlag Then
MsgBox “権限がありません。”, vbCritical
Exit Sub
End If

Set db = CurrentDb

‘ 2. 既存の同名クエリがあれば削除(クリーンな状態を作る)
On Error Resume Next
db.QueryDefs.Delete QRY_NAME
On Error GoTo 0

‘ 3. 新規にクエリを定義して生成
Set qdf = db.CreateQueryDef(QRY_NAME, strSQL)

‘ 4. 実行
qdf.Execute dbFailOnError

‘ 5. 後片付け(証拠を残さない!)
db.QueryDefs.Delete QRY_NAME

MsgBox “管理処理が完了しました。”, vbInformation

Set qdf = Nothing
Set db = Nothing
End Sub

—

コードの「魂」を読み解く:3つの重要ポイント

1. `CreateQueryDef` の魔力

`CreateQueryDef` は、SQL文を名前付きのオブジェクトに昇格させます。通常は保存されますが、あえて最後に `Delete` することで、データベースファイル内に「痕跡」を残さないようにしています。

2. `dbFailOnError` の重要性

`qdf.Execute` の引数に `dbFailOnError` を指定するのは鉄則です。これがないと、SQLエラーが起きた際、Accessは「何事もなかったかのように」処理を無視して突き進みます。エラーを確実に検知し、安全に停止させるための「安全装置」だと考えてください。

3. `On Error Resume Next` の正しい使い方

一時的なクエリを削除する際、まだ存在しない場合はエラーになります。あえてこの行を挟むことで、「あれば消す、なければ無視する」というスマートな処理を実現しています。

—

初学者が陥りやすい「落とし穴」

  • 「クエリが消えない!」問題: エラーハンドリングを怠ると、コードが途中で止まり、`temp_AdminTask` という名の空クエリが残り続けます。常に最後は `Nothing` にし、可能であれば `Error` トラップでクリーンアップ処理(Delete)を通るように設計しましょう。
  • パラメータクエリの罠: もし動的SQLに変数を含めるなら、文字列結合でSQLを作るのではなく、`qdf.Parameters` を使いましょう。これはSQLインジェクション対策の基本であり、プロとしての必須教養です。

—

最後に:エンジニアとしての一歩先へ

「クエリを隠す」という発想は、単なるセキュリティ技術ではなく、「システムのライフサイクルを意識する」というエンジニアの思考そのものです。

「作って終わり」ではなく、「生成して、実行し、消滅させる」。このサイクルを意識するだけで、あなたの書くVBAは驚くほど堅牢で美しいものに進化します。

今回のコードを、まずは自分のテスト環境で動かしてみてください。「自分の手でデータベースを制御している」という感覚が掴めれば、もうあなたは脱・初級者です。

次は、パラメーターを安全にバインドする方法について深く掘り下げていきましょう。応援していますよ!

タイトルとURLをコピーしました