Ziel: Wissen, wer was wann getan hat
Access kennt von sich aus kein Logging.
Wenn ein Benutzer etwas öffnet, ändert oder löscht, bekommst Du davon nichts mit.
Du willst: mitprotokollieren – aber unauffällig. Ohne Performance-Killer.
Variante 1: Zentrale Log-Tabelle
Tabelle tblBenutzerLog
:
ID
(Autowert)Zeitpunkt
Benutzer
Aktion
Modul
Details
Variante 2: Logging-Funktion zentral
Public Sub LogAktion(modul As String, aktion As String, Optional details As String = "")
Dim sql As String
sql = "INSERT INTO tblBenutzerLog (Zeitpunkt, Benutzer, Aktion, Modul, Details) " & _
"VALUES (Now(), '" & Environ("USERNAME") & "', '" & aktion & "', '" & modul & "', '" & Replace(details, "'", "''") & "')"
CurrentDb.Execute sql, dbFailOnError
End Sub
Kompakt. Schnell. Sicher.
Variante 3: Anwendung starten / beenden loggen
' AutoExec-Makro → Startformular öffnen
Private Sub Form_Load()
Call LogAktion("App", "Start")
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call LogAktion("App", "Beenden")
End Sub
Kann auch mit Timer
-Überwachung kombiniert werden (s. u.).
Variante 4: Formularöffnungen loggen
Private Sub Form_Open(Cancel As Integer)
Call LogAktion(Me.Name, "Formular geöffnet")
End Sub
Oder je nach Aktion:
- „Suche gestartet“
- „Details angezeigt“
- „Neuer Datensatz begonnen“
Variante 5: Änderungen an Daten erfassen (ohne Trigger)
Private Sub Form_BeforeUpdate(Cancel As Integer)
If Me.NewRecord Then
Call LogAktion(Me.Name, "Neuer Datensatz", "Name=" & Me.Name)
Else
Call LogAktion(Me.Name, "Datensatz geändert", "ID=" & Me.ID)
End If
End Sub
Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
Call LogAktion(Me.Name, "Löschung", "ID=" & Me.ID)
End Sub
So weißt Du, wer einen Datensatz angelegt, bearbeitet oder gelöscht hat.
Variante 6: Navigation überwachen
Jede Schaltfläche, die irgendwohin führt, ruft LogAktion
auf:
Private Sub cmdBericht_Click()
Call LogAktion("Navigation", "Bericht geöffnet", "rptUmsatz")
DoCmd.OpenReport "rptUmsatz", acViewPreview
End Sub
Damit bekommst Du echte Nutzungsauswertungen.
Variante 7: Inaktivität erkennen (optional)
Timer-Logik im Hauptformular:
Private Sub Form_Timer()
Static letzteAktion As Date
If letzteAktion = 0 Then letzteAktion = Now()
If DateDiff("n", letzteAktion, Now()) > 15 Then
Call LogAktion("Sitzung", "Inaktiv >15min")
letzteAktion = Now()
End If
End Sub
Timer-Intervall z. B. auf 60.000 ms setzen (1 Minute)
Best Practices
- Nutzername per
Environ("USERNAME")
ermitteln - Logging nie blockieren – also mit
On Error Resume Next
in der Funktion - sensible Daten wie Passwörter nie loggen
- Logs regelmäßig archivieren oder löschen
- Zugriff auf Log-Tabelle einschränken (
AdminOnly
)
Einsatzszenarien
- Nutzerverhalten analysieren
- Fehler nachvollziehen
- Änderungen dokumentieren (Datenschutz, ISO, GoBD, DSGVO)
- interne Revision
- Sicherheitskontrolle
Fazit für Entwickler
Logging in Access kostet wenig – bringt aber viel.
Du bekommst Transparenz, kannst Verhalten nachvollziehen und Probleme schneller aufklären.
No responses yet