Änderungen an einem Datensatz protokollieren

Änderungen an einem Datensatz protokollieren

am 11.11.2004 12:10:21 von os.news

Hallo,
ich habe eine Internet-Anwendung (HTML, PHP, MySQL), in der der
Anwender Kundenadressen aufrufen und ändern kann. Nun möchte ich gerne
protokollieren, welcher User wann welche Änderung an der Kundenadresse
vorgenommen hat. Mir fällt dazu nur folgende Lösung ein:

Die Originaltabelle hat z.B. die Spalten:

KundenID
Name
Straße
Ort
Telefon

Ich lege eine zweite Tabelle mit folgenden Spalten an:

UserID
DatumZeit
KundenID
NameAlt
StraßeAlt
OrtAlt
TelefonAlt
NameNeu
StraßeNeu
OrtNeu
TelefonNeu

Wenn der User nun einen Datensatz zum Ändern aufruft, schreibe ich die
Daten in diese Tabelle und ergänze den Datensatz um die neuen Daten,
wenn der User den geänderten Datensatz speichert.

Mir erscheint der Aufwand allerdings sehr hoch (zumal die
Kundentabelle in Wirklichkeit sehr viel mehr Spalten hat). Gibt es
eine elegantere Möglichkeit?

Im voraus vielen Dank.

Oliver Scholl

Re: Aenderungen an einem Datensatz protokollieren

am 11.11.2004 14:37:00 von l.willms

.. Am 11.11.04
schrieb os.news@gmx.de (Oliver Scholl)
auf /DE/COMP/LANG/PHP/DATENBANKEN
in 56b080a0.0411110310.3cac168d@posting.google.com
ueber Änderungen an einem Datensatz protokollieren

OS> Ich lege eine zweite Tabelle mit folgenden Spalten an:
OS>
OS> UserID
OS> DatumZeit
OS> KundenID
OS> NameAlt
OS> StraßeAlt
OS> OrtAlt
OS> TelefonAlt
OS> NameNeu
OS> StraßeNeu
OS> OrtNeu
OS> TelefonNeu
OS>
OS> Wenn der User nun einen Datensatz zum Ändern aufruft, schreibe ich
OS> die Daten in diese Tabelle und ergänze den Datensatz um die neuen
OS> Daten, wenn der User den geänderten Datensatz speichert.

Ich würd die Originaldaten irgendwo zwischenspeichern, und dann nur
die tatsächlich geänderten Daten protokollieren, und dazu einen
Protokollsatz verwenden, der nicht für jedes mögliche Feld eigene zwei
Felder mitführt, sondern nur zwei Spalten hat: 1. Name des geänderten
Feldes, 2. neuer Wert. Den alten Wert braucht man sich nicht zu
merken, wenn man die Änderungen in ihrer Reihenfolge aufrufen kann,
und so u.U. alle Änderungen bis zu einem bestimmten Zeitpunkt
nachvollziehen oder zurückrollen kann.

Man könnte u.U. so ein Änderungsprotokoll (Audit trail) für _alle_
Tabellen der Datenbank machen, wenn man noch den Namen der geänderten
Tabelle aufnimmt.

In PHP gibt es, soviel ich weiß, sowas wie assoziative Arrays, wo
man also paarweise Feldname (Spaltenname) und bisheriger Wert
zwischenspeichern könnte, die dann mit den neuen Werten verglichen
werden können, um die tatsächlichen Änderungen herauszufinden.

Sind mehrere Änderungen, will sagen, an mehreren Spalten, gemacht,
dann schreibt man eben je Feld einen Protokollsatz. Die müßten dann
allerdings dieselbe Folgenummer oder einen identischen Zeitstempel
haben.

Übrigens: gute Datenbanksysteme führen selber ein Audit Trail, auch
ohne benutzerseitiger Programmierung.


MFG,
Lüko Willms http://www.mlwerke.de
/--------- L.WILLMS@jpberlin.de -- Alle Rechte vorbehalten --

"Ohne Pressefreiheit, Vereins- und Versammlungsrecht ist keine
Arbeiterbewegung möglich" - Friedrich Engels (Februar 1865)

[OT] Re: Aenderungen an einem Datensatz protokollieren

am 11.11.2004 17:00:25 von Frank Schenk

Lueko Willms wrote:

> . Am 11.11.04
> schrieb os.news@gmx.de (Oliver Scholl)
> auf /DE/COMP/LANG/PHP/DATENBANKEN
> in 56b080a0.0411110310.3cac168d@posting.google.com
> ueber Änderungen an einem Datensatz protokollieren
>
> OS> Ich lege eine zweite Tabelle mit folgenden Spalten an:
> OS>
> OS> UserID
> OS> DatumZeit
> OS> KundenID
> OS> NameAlt
> OS> StraßeAlt
> OS> OrtAlt
> OS> TelefonAlt
> OS> NameNeu
> OS> StraßeNeu
> OS> OrtNeu
> OS> TelefonNeu
> OS>
> OS> Wenn der User nun einen Datensatz zum Ändern aufruft, schreibe ich
> OS> die Daten in diese Tabelle und ergänze den Datensatz um die neuen
> OS> Daten, wenn der User den geänderten Datensatz speichert.

Lernst du das Quoten denn nie Lueko Willms?
Und dieser Einleitungsroman.

*plonk*

F'up2poster

Frank

Re: Änderungen an einem Datensatz protokollieren

am 11.11.2004 17:06:52 von Niels Braczek

Oliver Scholl schrieb:

> ich habe eine Internet-Anwendung (HTML, PHP, MySQL), in der der
> Anwender Kundenadressen aufrufen und ändern kann. Nun möchte ich gerne
> protokollieren, welcher User wann welche Änderung an der Kundenadresse
> vorgenommen hat. Mir fällt dazu nur folgende Lösung ein:
> [...]
> Wenn der User nun einen Datensatz zum Ändern aufruft, schreibe ich die
> Daten in diese Tabelle und ergänze den Datensatz um die neuen Daten,
> wenn der User den geänderten Datensatz speichert.
>
> Mir erscheint der Aufwand allerdings sehr hoch (zumal die
> Kundentabelle in Wirklichkeit sehr viel mehr Spalten hat). Gibt es
> eine elegantere Möglichkeit?

Du kannst die Original-Tabelle um zwei Spalten ergänzen:
MODIFIED (Timestamp)
MODIFIER (FK) // UserID

Für die Backups benutzt du dieselbe Struktur mit ID *und* MODIFIED als
Primary Key. Geänderte oder gelöschte Datensätze kopierst du dann 1:1
um. Der Rest ist rekonstruierbar.

MfG
Niels

--
> Bitte stelle auch das Plenken (Leerzeichen vor Satzzeichen) ein.
sorry die doofe Frage : Wo stelle ich das ein, habe in den Settings von
Outlook Newsreader nix gefunden
[Klaus Gromann in dclpm]