マクロ vs VBA:それぞれの得意分野を活かした開発手順
nanikatoaccess
なにか to Access
以下では、「ユーザー権限管理:Accessで実装できる簡易認証と機能制限」をテーマに、Microsoft Accessでどのようにユーザーごとにアクセス制御(機能の制限や認証)を行うかを解説します。AccessはWebアプリやSQL Serverのように高度なユーザー管理機能を標準装備していないため、小~中規模のシステムであれば、簡易的なテクニックを用いてユーザー権限を振り分けるのが一般的です。ぜひ参考にしてみてください。
ポイント
- Accessは基本的に「ファイル1つ」として運用するため、大規模DBのようなロール管理はない
- 代わりに簡易的なログイン画面を自作して、機能を制御する方法が広く使われる
注意: もし旧形式(.mdb)でULSを使っている場合も、新規採用は推奨されない。Modern Access(.accdb)に移行するなら自作の簡易認証やバックエンドをSQL Serverにするといった手段が無難。
tbl_ユーザー
ユーザーID
とパスワード
を入力させて照合Public Sub LoginCheck(strUser As String, strPass As String)
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM tbl_ユーザー WHERE ユーザーID='" & strUser & "' AND パスワード='" & strPass & "'")
If rs.EOF Then
MsgBox "ユーザー名またはパスワードが違います", vbExclamation
Else
' ログイン成功
g_strCurrentUserID = strUser
g_strCurrentRole = rs!権限レベル
DoCmd.OpenForm "メインメニュー"
DoCmd.Close acForm, "ログインフォーム"
End If
rs.Close
Set rs = Nothing
End Sub
注意: 上記は文字列連結なので、SQLインジェクションに注意。安全のためパラメータクエリ等を使うほうが望ましい(例示なので簡易です)。
権限レベル = "admin"
なら「ユーザー管理画面」を表示し、それ以外のスタッフには非表示にPrivate Sub Form_Open(Cancel As Integer)
' メインメニューフォームで管理者ボタンを制御
If g_strCurrentRole <> "admin" Then
Me.btn管理者機能.Visible = False
End If
End Sub
If g_strCurrentRole <> "admin" Then Exit Sub
のような記述でボタンクリックを抑止If Role <> "Admin" Then btnAdmin.Visible = False
などAccessの標準では高度なユーザー管理機能(ULS) は既に廃止され、自前でフォーム認証やUI制限を行うのが主流です。小~中規模であればこれで十分なケースが多く、簡易的にも安全性を高められます。要件に応じてSQL Server連携へ移行する選択肢も検討し、手軽さとセキュリティをバランスさせてみてください。
関連記事
これらの方法を使えば、初心者でも簡易的な権限管理をAccessで組めます。少なくとも外部から一切の制限なしという状態よりははるかに安全。業務内容やユーザー数に応じて、スモールスタートしつつ将来は本格RDBMSにも視野を広げましょう。