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
Rolle | Anzeigen | Bearbeiten | Löschen | Admin |
---|---|---|---|---|
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
:
Rolle | Objekt | Aktion | Erlaubt |
---|---|---|---|
Buchhaltung | Formular_Rech | Bearbeiten | Ja |
Vertrieb | Formular_Rech | Löschen | Nein |
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
Komponente | Umsetzung |
---|---|
Benutzerkennung | Environ(„USERNAME“) |
Rollenpflege | Tabelle Benutzer |
RechteprĂŒfung | Funktionsbasiert mit Matrix |
Maskensteuerung | VBA bei Form_Load |
Datenzugriff | Sicht + 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.
No responses yet