Wenn jeder alles darf

Dann dauert es nicht lange, bis jemand versehentlich 200 Rechnungen löscht.
Oder aus Versehen Stammdaten Àndert.
Oder einfach mal neugierig in alle Angebote guckt.

Ohne klare Benutzerrechte ist Access ein Selbstbedienungsladen.
Und irgendwann ist die Kasse leer.

Warum Access-Berechtigungen nicht reichen

Die alten .mdw-Dateien? Abgehakt.
Frontend-Passwortschutz? Kinderkram.
Tabellen sperren? Nur auf Dateiebene.

Was Du brauchst, ist Logik im Code – kombiniert mit SQL-Backend und Benutzerrollen.

Mein Ansatz: rollenbasierte RechteprĂŒfung

  • Jeder Benutzer hat eine Rolle
  • Jede Rolle definiert, was erlaubt ist
  • Beim Start wird die Rolle geladen
  • Alle Aktionen prĂŒfen diese Rolle

Das ist flexibel. Und nachvollziehbar.

Tabelle: Beispielhafte Rollen

RolleAnzeigenBearbeitenLöschenAdmin
Vertrieb✅✅❌❌
Buchhaltung✅✅✅❌
Admin✅✅✅✅

Die Tabelle liegt im Backend – kann also gepflegt werden, ohne das Frontend neu zu bauen.

Beispiel: Benutzerrolle laden

Public gstrBenutzername As String
Public gstrBenutzerrolle As String

Public Sub LadeBenutzer()
    gstrBenutzername = Environ("USERNAME")

    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT Rolle FROM Benutzer WHERE Loginname = '" & gstrBenutzername & "'")

    If Not rs.EOF Then
        gstrBenutzerrolle = rs!Rolle
    Else
        MsgBox "Benutzer nicht bekannt. Zugriff verweigert."
        DoCmd.Quit
    End If

    rs.Close
    Set rs = Nothing
End Sub

Aufruf im Autoexec oder beim Form_Load des HauptmenĂŒs.

Beispiel: Bearbeiten verhindern bei fehlendem Recht

Private Sub Form_Current()
    If gstrBenutzerrolle <> "Admin" And gstrBenutzerrolle <> "Buchhaltung" Then
        Me.AllowEdits = False
        Me.AllowAdditions = False
        Me.AllowDeletions = False
    End If
End Sub

Oder gezielter fĂŒr einzelne Steuerelemente:

Me.btnLöschen.Visible = (gstrBenutzerrolle = "Admin")

Optional: Rechte matrixgesteuert abfragen

Tabelle RollenRechte:

RolleObjektAktionErlaubt
BuchhaltungFormular_RechBearbeitenJa
VertriebFormular_RechLöschenNein

Zugriff per Funktion:

Public Function HatRecht(Rolle As String, Objekt As String, Aktion As String) As Boolean
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT Erlaubt FROM RollenRechte " & _
        "WHERE Rolle='" & Rolle & "' AND Objekt='" & Objekt & "' AND Aktion='" & Aktion & "'")

    If Not rs.EOF Then
        HatRecht = (rs!Erlaubt = "Ja")
    Else
        HatRecht = False
    End If

    rs.Close
    Set rs = Nothing
End Function

Nutzung:

If Not HatRecht(gstrBenutzerrolle, "Formular_Rech", "Bearbeiten") Then
    Me.AllowEdits = False
End If

SQL Server: Rechte auch auf Datenebene durchsetzen

-- Zugriff einschrÀnken per Sicht
CREATE VIEW Sicht_Kunden_Vertrieb
AS
SELECT KundenID, Name, PLZ
FROM Kunden
WHERE Aktiv = 1;
-- Rollenvergabe
CREATE ROLE vertrieb;
GRANT SELECT ON Sicht_Kunden_Vertrieb TO vertrieb;

Access sieht dann nur, was er sehen soll.

Mein Setup in KMU-Projekten

KomponenteUmsetzung
BenutzerkennungEnviron(„USERNAME“)
RollenpflegeTabelle Benutzer
RechteprĂŒfungFunktionsbasiert mit Matrix
MaskensteuerungVBA bei Form_Load
DatenzugriffSicht + Rolle auf SQL Server

Mein geistreicher Kommentar

Access ohne Rechte ist wie Excel mit Schreibschutz – bringt nix.
Mach’s sauber.
Mach’s flexibel.
Dann brauchst Du Dich spÀter nicht zu rechtfertigen.

Categories:

Tags:

No responses yet

Schreibe einen Kommentar

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