Frage

Für ein Projekt arbeite ich an, ich bin gebeten worden, einen Audit-Trail aller Änderungen zu erstellen, die Aufzeichnungen gemacht wurden. Dies ist das erste Mal, das ich je hatte einen Audit-Trail zu schaffen, so habe ich eine Menge Forschung zu diesem Thema gemacht haben.

Die Anwendung wird in PHP / MSSQL entwickelt werden und wird gering frequentierte sein.

Aus meiner Lektüre, ich habe so ziemlich entschieden, eine Audit-Tabelle zu haben, und die Verwendung löst die Änderungen in der Tabelle zu notieren.

Die beiden Anforderungen für die Anzeige in der Anwendung sind wie folgt:

  1. Die Lage sein, ein Protokoll aller Änderungen an ein Feld (ich weiß ziemlich genau, wie dies zu tun), um zu sehen

  2. Lage sein zu sehen, wenn ein Datensatz in der Anwendung sehen, einen Indikatoren neben ein Feld im Datensatz, der jemals geändert wird (und möglicherweise andere Informationen wie das Datum der letzten Änderung).

Artikel # 2 ist derjenige, der zur Zeit mir Leid gibt. Ohne eine separate Abfrage für jedes Feld zu tun (oder eine sehr lange verschachtelte Abfrage, die ewig dauern wird ausführen), hat jemand Vorschläge für eine optimale Art und Weise, dies zu tun? (Ich habe gedacht, ein zusätzliches „ModifiedFlag“ Feld für jedes Feld in der Tabelle, die als boolean Indikatoren fungieren wird, wenn das Feld jemals bearbeitet wurde, aber das scheint wie eine Menge Aufwand.

War es hilfreich?

Lösung

würde ich die Audit-Informationen getrennt von den eigentlichen Domain-Informationen so weit wie möglich behandeln.

Anforderung # 1: Ich glaube, Sie zusätzliche Audit-Tabellen erstellen die Änderungen aufzuzeichnen. Eric Vorschlag ist gut, die Schaffung der Audit-Informationen mit Auslösern in der SQL-Datenbank. Auf diese Weise Ihre Anwendung benötigt die Prüfung Logik nicht bewusst sein.

Wenn Ihre Datenbank nicht Trigger unterstützen, dann vielleicht Sie irgendeine Art von Persistenz oder Datenbankschicht verwenden. Dies wäre auch ein guter Ort, um diese Art von Logik zu setzen, wie es wieder minimieren Sie alle Abhängigkeiten zwischen normalen Anwendungscode und der Audit-Code.

Anforderung # 2: Was die Indikatoren zeigen: ich würde nicht boolean Felder in der Tabelle erstellen, die die tatsächlichen speichern. (Dies würde alle Arten von Abhängigkeiten führen zu existieren zwischen dem normalen Anwendungscode und Ihre Prüfpfad Code).

Ich würde versuchen, den Code für die Anzeige der Form auch für die Ansicht Audit-Daten auf Feldebene verantwortlich sein zu lassen. Dies wird Abfrage Aufwand verursachen, aber das ist die Kosten für diese zusätzliche Schicht von Informationen angezeigt werden. Vielleicht können Sie durch Hinzufügen von Metadaten in die Audit-Informationen, die Datenbank-Overhead minimieren, die für den einfachen Abruf ermöglicht.

Einige große Enterprisy Anwendung, die ich pflegen verwendet etwa die folgende Struktur:

  • Eine Änderung Kopftabelle auf eine Änderung eines Datensatzes in einer Tabelle entspricht.

Felder:

changeId, changeTable, changedPrimaryKey, userName, dateTime

-. Eine Änderung Feldtabelle auf ein Feld entspricht, das geändert wird,

Felder:

changeId, changeField, oldValue, NewValue

Probengehalt:

Ändern Rubrik:

'1', 'BooksTable', '1852860138', 'AdamsD', '2009-07-01 15:30'

Ändern Artikel:

'1', 'Title', 'The Hitchhiker's Guide to the Gaxaly', 'The Hitchhiker's Guide to the Galaxy'
'1', 'Author', 'Duglas Adasm', 'Douglas Adams'

Diese Struktur ermöglicht sowohl eine einfache Anzeige von Audit-Trails sowie einfachen Abruf für die gewünschten Indikatoren zeigen. Eine Abfrage (innere Verknüpfung in der Kopf- und Items-Tabelle) würde ausreichen, um alle Informationen abzurufen, in einer einzigen Form zu zeigen. (Oder auch eine Tabelle, wenn Sie eine Liste der angezeigten IDs)

Andere Tipps

Als eine allgemeine Anforderung Beflaggung Feld geändert „riecht“ etwas seltsam. Wenn Aufzeichnungen lange gelebt und unterliegen Zeit wechseln dann schließlich alle Felder neigen dazu, so markiert werden. Daher frage ich mich, wie jeder Benutzer Sinn eines einfachen Satzes von Indikatoren pro Feld machen könnte.

Diese Linie des Denkens macht ich vermute, dass die Daten, die Sie speichern Bedürfnisse sein, wie Sie beschrieben haben, ein echter Audit-Trail mit allen Änderungen aufgezeichnet, und die erste wirkliche Herausforderung besteht darin, zu entscheiden, wie die Informationen sollten vorgelegt werden der Benutzer.

Ich denke, Ihre Idee, eine Art von aggregateOfTheAuditTrail Daten der Vorbereitung ist wahrscheinlich sehr nützlich sein. Die Frage wäre ein einzelnes Flag pro Datensatz genug? Wenn die primäre Benutzerzugriff durch Liste ist dann vielleicht ist es genug, nur die geänderten Datensätze markieren für später nach unten bohren. Oder ein Datum der letzten Änderung des Rekordwert, so dass erst vor kurzem geänderten Datensätze hervorgehoben werden - all das zurück, was die tatsächlichen Bedürfnisse des Benutzers sind. Ich finde es schwer vorstellbar, dass Datensätze geändert 3 Jahre als diejenigen geändert letzte Woche vor, wie interessant geschnitten sind.

Wenn wir dann auf den Bohrer kommen zu einem einzigen Datensatz. Wieder ein einfaches Flag pro Feld klingt nicht sinnvoll (wenn Sie Ihre Domäne, Ihre Anforderungen). Wenn ja, dann Zusammenfassung Idee ist in Ordnung. Meine Vermutung ist, dass eine Folge von Änderungen an ein Feld, und die Abfolge der allgemeinen Veränderungen auf den Datensatz, ist viel interessanter. Mitarbeiter hatten Lohnerhöhung, Mitarbeiter bewegt Abteilung, Mitarbeiter befördert = drei separate Business-Events oder ein?

Wenn etwas mehr als ein einfaches Flag benötigt wird, dann vermute ich, dass Sie nur die ganze zurückkehren müssen (oder neue) Audit-Trail für die Aufzeichnung und lassen Sie die UI herauszufinden, wie das präsentieren.

Also, mein erster Gedanke: Irgendeine Art von Roll Wartung einer Zusammenfassung Platte klingt wie eine gute Idee. Bei Bedarf im Hintergrund Fäden oder Batch-Jobs erhalten. Wir deisgn, dass jedes Mal, ohne sie die vollständigen Audit-Trail-Geschäft nützlich zu sein. Dann gilt für detaillierte Analysen wir einige oder alle der Spur ermöglichen abgerufen werden.

Persönlich würde ich das Tracking einfach machen, und die Berichterstattung flippig.

Jedes Mal, wenn ein Benutzer einen Datensatz einfügt, Sie machen einen Einsatz in die Audit-Tabelle für die Tabelle

'I', 'Date', 'User', 'Data column1','Data Column2', etc.

Das ist die Struktur der Tabellen unter der Annahme, im Laufe der Zeit nicht ändern wird (re., Die Menge von Datacolumns)

Für Updates, nur einfügen

'U', 'Date', 'User', 'Data column1', etc

Legen Sie, was der Benutzer gerade als Update eingegeben.

Dann, nach dem Einsatz und Update, Sie haben die folgende

'I','May 3 2009','BLT','person005','John','Smith','Marketing'
'U','May 4 2009','BLT','person005','John','Smith','Accounting'

Dann ist es nur ein einfacher Bericht zu zeigen, dass die einzigartigen Person record ‚person005‘ einen Einsatz und ein Update hatte, wo ihre Abteilung aktualisiert wurde.

Durch die geringe Nutzung des Systems, einen einfachen Einsatz mit auf der Veränderung dann ein komplexere Reporting-Prozess wird nicht die Leistung zu bewirken. Dieser Stil wird immer noch mit höheren Verkehrssystemen arbeiten, da die zusätzliche Last auf einem bearbeiten minimal, während die höhere Intensität Arbeitsbelastung der Berichterstattung über die Änderungen wieder nicht so oft, wie ein Update durchgeführt, so dass das System nicht umfallen.

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