Frage

Ich versuche, einige Funktionen zu erstellen, die eine Audit-Trail, wie Daten in einer bestimmten Benutzer Form im Laufe der Zeit geändert wurden, mit einer datierten Prüfung am Fuß dieser Seite hält. Zum Beispiel:

02/04/09 21.49 Namen geändert von "Tom" auf "Chris".

Ich tue dies, indem sie die Speicherung von Daten in es in der Sitzung anwesend Format ist und dann, ob es speichern Überprüfung irgendwelche Unterschiede in den Daten gespeichert werden. Wenn ja, ich bin mit den Speichern von Daten, wie es vor der letzten Bearbeitung war in einer Tabelle mit dem Namen der Geschichte, und die neuen Werte in der aktuellen Benutzertabelle gespeichert werden.

Ist dies der beste Ansatz zu werden?

War es hilfreich?

Lösung

Ein Vorschlag; Dies wäre relativ einfach, in einem Datenbank-Trigger zu tun. In diesem Fall würde man nie befürchten, ob der Code läuft das Update erinnert sich an eine Geschichte Datensatz hinzufügen.

Andere Tipps

Ich bin mir nicht sicher, dass es eine „beste Ansatz“ ist, gibt es so viele Variablen zu berücksichtigen, einschließlich, wie weit die Entwicklung Pfad Sie sind.

Nachdem beide Code-Basis durchgemacht und db-Trigger Revisions Lösungen habe ich einige Kommentare unten aufgeführt; Ich hoffe, Sie können sehen, wo Sie jetzt an sind (in Bezug auf die Entwicklung) könnten diese Probleme betreffen:

  • Wenn Sie den Benutzer zuordnen müssen, die die Daten geändert (die Sie normalerweise tun), dann db Trigger müssen diese Informationen irgendwie zu bekommen. Nicht unmöglich, aber mehr Arbeit und mehrere Möglichkeiten, diese zu nähern (db Benutzer QUERY, gemeinsame Benutzer Spalte in jeder Tabelle, etc.)
  • Wenn Sie db-Trigger verwenden, und Sie verlassen sich auf betroffenen Zeilen von Abfragen zurückgegeben Zahl, dann löst Ihre Prüfung müssen dies ausgeschaltet haben, oder Ihre vorhandenen Code für sie zu berücksichtigen geändert.
  • IMHO db Trigger bietet mehr Sicherheit und bietet einen einfacheren Weg Automatisierung zu prüfen, aber sie nicht narrensicher sind, wie jemand mit entsprechenden Zugriffs kann die Auslöser deaktivieren, Daten ändern und sie dann wieder aktivieren. Mit anderen Worten, sicherzustellen, dass Ihre db Sicherheit Zugriffsrechte fest sind.
  • eine einzige Tabelle für die Geschichte zu haben, ist kein schlechter Weg zu gehen, obwohl Sie mehr Arbeit (und Daten zu speichern) zu tun haben, wenn Sie Geschichte für mehrere Tabellen Prüfung, vor allem, wenn es um die Rekonstruktion des Audit-Trail kommt. Sie müssen auch Sperren Probleme berücksichtigen, wenn es viele Tabellen versuchen, eine Audit-Tabelle zu schreiben.
  • für jede Tabelle eine Audit Verlaufstabelle zu haben, ist eine weitere Option. Sie müssen nur jede Spalte in der Audit-Tabelle NULL-Werte zulässt, sowie die Speicherung von Datum und Uhrzeit der Aktion (insert / update / delete) und dem Benutzer sein, die mit der Aktion.
  • Wenn Sie mit dem Einzeltisch Option zu gehen, es sei denn Sie viel Zeit haben auf diesem zu verbringen, nicht zu extravagant bekommen versucht nur auf Updates oder Löschungen zu prüfen, obwohl es verlockend sein kann Einsätze zu vermeiden (da die meisten Anwendungen tun dies häufiger als Updates oder löschen), nimmt ein gutes Stück Arbeit die Prüfungs Geschichte zu rekonstruieren.
  • Wenn Sie Ihre Server oder Daten mehr Zeitzonen erstrecken, sollten Sie dann einen entsprechenden Datetime-Typen mit der Lage sein, den Zeitplan zu speichern und zu rekonstruieren, das heißt Speicher Prüfereignis Datum in UTC sowie einschließlich der Zeitzone gegenüber.
  • Diese Audit-Tabellen können sehr groß, bekommen so eine Strategie haben, wenn sie für die Performance beginnen. Die Optionen umfassen die Tabellenpartitionierung auf verschiedene Scheiben, Archivierung usw. denken im Grunde darüber jetzt und nicht, wenn es zu einem Problem:)

Ich bin schon immer ein Fan von einer Tabelle verwendet, anstatt sie zu brechen in einen „aktiven“ Tisch und eine „Geschichte“ Tabelle. Ich habe 4 Spalten auf diesen Tabellen alle Zeitstempel: erstellt, gelöscht, Beginn, Ende. „Erstellt“ und „gelöscht“ sind ziemlich selbsterklärend. Die „Start“ und „Ende“ Zeitstempel sind für, wenn der Datensatz war eigentlich der „aktive“ Rekord. Der aktuell aktive Datensatz würde eine vorherige Zeit „Start“ now() und NULL „Ende“ -Zeit. Durch die Trennung aus den „geschaffen“ und „Start“ Zeiten, können Sie Änderungen planen in der Zukunft zu nehmen.

Dieser Entwurf, in Bezug auf die Zwei-Tabellen-Design im Gegensatz ermöglicht Ihnen die einfache Abfragen zu schreiben, die auf die richtigen Daten automatisch betrieben werden kann. Angenommen, Ihre Tabelle den Steuersatz im Laufe der Zeit speichert ... Sie wollen nicht alle Ihre Fragen haben, die Steuersätze verwenden in ihren Berechnungen haben die zusätzliche Komplexität des Entscheidens Sachen in einer History-Tabelle nachschlagen, wenn alte Rechnungen verarbeiten, für Beispiel ... Sie können nur den Steuersatz in der zum Zeitpunkt sehen die Rechnung in einer Abfrage erstellt wurde, unabhängig davon, ob es sich um die aktuelle Steuersatz oder nicht.

Diese Idee ist nicht ursprünglich Mine (obwohl ich die grobe Idee auf meinem eigenen vor darüber zu lesen war neu zu erfinden) ... finden Sie eine detaillierte Diskussion in dieser Online-Buch .

Die Sitzung Beteiligung macht mir ein wenig vorsichtig (sind Sie sicher, dass Sie es richtig sind Handhabung, wenn zwei Benutzer auf den gleichen Daten zur gleichen Zeit arbeiten?), Aber im Allgemeinen, ja, eine History-Tabelle zu halten, ist das Recht Sache.

Ich würde denken, auch über eine Datenbank-Trigger auf Insert oder Update Satzwechseln Details (wer, wann, was, den Wert vor, den Wert nach) zu einer separaten Audit-Tabelle. Auf diese Weise wissen Sie, dass selbst wenn die Daten outide Ihre Anwendung geändert werden direkt auf die Datenbank verwendet wird, wird es noch abgeholt werden.

Sie mögen vielleicht auch etwas zu erkennen, tun, wenn die Daten outide Ihre Anwendung geändert werden, wie berechnet einen Hash oder crc der Aufzeichnung und speichern sie irgendwo auf einem Feld, dann überprüfen, wenn die Daten zu lesen.

Ich denke, Ihr Vorschlag würde bedeuten, eine Menge Code / Metadaten Schreiben Vergleich von Objekten / Datensätze zu ermöglichen, so dass Sie eine Business-Level-Prüfung erhalten.

Alternativ kann eine Datenbank-Trigger geben Ihnen einen ausreichend hohen Niveau Blick auf, was passiert ist. Dies kann akzeptabel sein, wenn Sie die Prüfung verwenden, so selten, dass der Versuch, die betriebswirtschaftliche Bedeutung der Neuerstellung ist in Ordnung.

Das scheint auch wie eine gute Anwendung für AOP (Aspekte), wo Sie Reflexion auf das Objektmodell etwas Sinnvolles zu entleeren, ohne dass eine Menge von Metadaten verwenden könnten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top