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.

Categories:

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert