Worum geht’s?
Wenn Access und WordPress Hand in Hand arbeiten, willst Du wissen,
wer was wann geändert oder gesehen hat – und in welchem System.
Ein einfaches Audit-Log in einem System reicht nicht.
Wir brauchen ein kombiniertes Logging – Access lokal, WordPress im Web.
Und beides möglichst automatisiert und nachvollziehbar.
Was loggen wir?
Grundsätzlich:
- Zugriffe auf sensible Daten
- Änderungen an Datensätzen
- Löschungen
- Login und Logout (nur WordPress)
Ziel: Ein gemeinsames Reporting, aber getrennte Datenerfassung.
Teil 1: Audit-Logging in Access (lokal)
Tabellenstruktur für Log
Erstelle in Access eine Tabelle tblAuditLog:
| Feldname | Typ |
|---|---|
| ID | Autowert |
| Zeitpunkt | Datum/Zeit |
| Benutzer | Text (50) |
| Aktion | Text (50) |
| Tabelle | Text (50) |
| Primärschlüssel | Text (50) |
| Details | Memo |
Beispiel-VBA für INSERT/UPDATE-Logging
Public Sub LogChange(ByVal Aktion As String, ByVal Tabelle As String, ByVal PK As String, Optional ByVal Details As String = "")
Dim sql As String
sql = "INSERT INTO tblAuditLog (Zeitpunkt, Benutzer, Aktion, Tabelle, Primärschlüssel, Details) " & _
"VALUES (Now(), '" & Environ("USERNAME") & "', '" & Aktion & "', '" & Tabelle & "', '" & PK & "', '" & Replace(Details, "'", "''") & "')"
CurrentDb.Execute sql, dbFailOnError
End Sub
Einsatz z. B. im Formular-AfterUpdate
Private Sub Form_AfterUpdate()
Call LogChange("Update", Me.RecordSource, Me.ID, "Feld1=" & Me.Feld1 & "; Feld2=" & Me.Feld2)
End Sub
Optional: Nur bei echten Änderungen loggen
Dafür müsstest Du Dir vorherige Feldwerte merken und vergleichen – Aufwand lohnt sich bei komplexen Tabellen.
Teil 2: Audit-Logging in WordPress (webbasiert)
Varianten
- Plugin verwenden
Plugins wie „WP Activity Log“ oder „Simple History“ loggen viele Aktionen automatisch. - Eigene Logging-Tabelle + PHP-Hooks
Für eigene Datenbankanwendungen mit benutzerdefinierten CPTs oder API-Zugriffen lieber direkt selber loggen.
Tabellenstruktur in MySQL
CREATE TABLE wp_custom_auditlog (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
timestamp DATETIME NOT NULL,
user_id BIGINT,
action VARCHAR(100),
object_type VARCHAR(50),
object_id VARCHAR(50),
details TEXT
);
PHP-Funktion zum Logging
function log_custom_action($action, $object_type, $object_id, $details = '') {
global $wpdb;
$wpdb->insert('wp_custom_auditlog', [
'timestamp' => current_time('mysql'),
'user_id' => get_current_user_id(),
'action' => $action,
'object_type' => $object_type,
'object_id' => $object_id,
'details' => $details
]);
}
Beispiel-Aufruf
log_custom_action('update', 'lieferung', 1021, 'Lieferdatum geändert von 10.7 auf 12.7');
Teil 3: Konsolidierung beider Logs
Du brauchst keinen „Live-Abgleich“.
Aber eine vereinheitlichte Auswertung ist sinnvoll.
Z. B. über Power BI, Access-Abfragen oder SQL Server Import.
Option 1: SQL Server übernimmt beide Logs
Importiere regelmäßig:
tblAuditLogaus Accesswp_custom_auditlogaus MySQL (ODBC-Linked Table oder ETL)
Option 2: Access liest beide Logs
Beispiel-Abfrage mit UNION:
SELECT Zeitpunkt, Benutzer, Aktion, Tabelle AS Objekt, Primärschlüssel AS ObjektID, Details
FROM tblAuditLog
UNION ALL
SELECT timestamp, u.user_login, action, object_type, object_id, details
FROM wp_custom_auditlog l
LEFT JOIN wp_users u ON l.user_id = u.ID
Voraussetzung: wp_users ist ebenfalls verknüpft via ODBC.
Besonderheit: Löschungen
In Access:
- Vor dem Löschen per
BeforeDelConfirmein Log schreiben
Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
Call LogChange("Delete", Me.RecordSource, Me.ID)
End Sub
In WordPress:
- Vor dem Löschen
before_delete_postoderdelete_postHook nutzen:
add_action('before_delete_post', function($post_id) {
log_custom_action('delete', 'post', $post_id, 'Post gelöscht');
});
Sicherheit & DSGVO
- Keine sensiblen personenbezogenen Daten im Klartext loggen
- Wenn doch, dann mit Zugriffsschutz und Löschkonzept
- Log-Tabellen selbst nicht manipulierbar machen (nur INSERT)
Mein Fazit
Zwei Welten, ein Ziel: nachvollziehen, was war.
Mit ein paar Zeilen Code bekommst Du saubere Logs – getrennt, aber auswertbar.
Du brauchst nur Disziplin. Und einen Schafstall, der nicht wackelt.