Ziel: Unterschiedliche Rechte für unterschiedliche Nutzer
Nicht jeder soll alles sehen oder ändern.
Du brauchst Rollen:
Admin, Sachbearbeiter, Nur-Leser, vielleicht auch externes Personal.
Und Access muss das unterscheiden. Sauber und zuverlässig.
Variante 1: Rollen in Tabelle speichern
Tabelle tblBenutzer
Benutzername
Rolle
(z. B. „Admin“, „Mitarbeiter“, „Viewer“)Aktiv
(Ja/Nein)
Abfrage beim Start
Public Benutzerrolle As String
Public Sub HoleBenutzerrolle()
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT Rolle FROM tblBenutzer WHERE Benutzername = '" & Environ("USERNAME") & "' AND Aktiv = True")
If Not rs.EOF Then
Benutzerrolle = rs!Rolle
Else
MsgBox "Benutzer nicht registriert.", vbCritical
DoCmd.Quit
End If
End Sub
Am besten im AutoExec-Makro oder beim Öffnen des Startformulars aufrufen.
Variante 2: Formulare dynamisch anpassen
Private Sub Form_Open(Cancel As Integer)
If Benutzerrolle = "Viewer" Then
Me.AllowEdits = False
Me.AllowAdditions = False
Me.AllowDeletions = False
End If
End Sub
Oder Buttons ein-/ausblenden:
Me.cmdLöschen.Visible = (Benutzerrolle = "Admin")
Variante 3: Navigation begrenzen
Navigation als Formular gestalten – nicht über Navigationsbereich.
Nur erlaubte Buttons anzeigen:
Private Sub Form_Load()
Select Case Benutzerrolle
Case "Admin"
' alles anzeigen
Case "Mitarbeiter"
Me.cmdAdminpanel.Visible = False
Case "Viewer"
Me.cmdBearbeiten.Visible = False
Me.cmdNeu.Visible = False
End Select
End Sub
Variante 4: Datenzugriff per Abfrage einschränken
Beispiel: Nur eigene Datensätze anzeigen
In Abfrage:
SELECT * FROM tblAufträge WHERE Benutzer = Environ("USERNAME")
Oder per VBA Abfrage dynamisch manipulieren:
Me.RecordSource = "SELECT * FROM tblAufträge WHERE Benutzer = '" & Environ("USERNAME") & "'"
Oder Rollenbasiert:
If Benutzerrolle = "Admin" Then
Me.RecordSource = "SELECT * FROM tblAufträge"
Else
Me.RecordSource = "SELECT * FROM tblAufträge WHERE Benutzer = '" & Environ("USERNAME") & "'"
End If
Variante 5: Menüband anpassen (Ribbon)
Wenn Du Ribbon-XML verwendest, kannst Du Tabs per Rolle ein-/ausblenden.
Public Function GetVisible(control As IRibbonControl) As Boolean
Select Case control.ID
Case "tabAdmin"
GetVisible = (Benutzerrolle = "Admin")
Case Else
GetVisible = True
End Select
End Function
Ribbon wird über Callback-Funktion gesteuert.
Variante 6: Aktionsprotokoll (Audit Trail)
Bei rollenbasierten Systemen willst Du auch wissen, wer was gemacht hat.
Public Sub LogAktion(modul As String, aktion As String)
CurrentDb.Execute "INSERT INTO tblAudit (Benutzer, Zeitpunkt, Modul, Aktion) VALUES " & _
"('" & Environ("USERNAME") & "', Now(), '" & modul & "', '" & aktion & "')"
End Sub
Aufruf z. B. beim Speichern:
Call LogAktion("frmKunden", "Datensatz geändert: ID " & Me.ID)
Best Practices
- Kein Benutzer ohne Rolle
- Rolle als ENUM verwenden (kein Freitext)
- Zugriff immer zentral prüfen, nicht quer im Formular verstreut
- Sicherheitskritisches wie Löschen immer absichern
- Adminfunktionen visuell klar abgrenzen
Einsatzszenarien
- Schulungsdatenbank (Trainer vs. Teilnehmer)
- Außendienst (eigene Daten, kein Export)
- Projektverwaltung mit Stufenzugriff
- ERP-Erweiterungen mit Sachbearbeiter-/Leitertrennung
- Externe Partner mit Lesezugriff
Fazit für Entwickler
Rollensteuerung in Access ist simpel, wenn Du’s von Anfang an sauber aufziehst.
Zentrale Rollenerkennung, klare Sichtbarkeit, kein Wildwuchs im Formularcode.
No responses yet