Derzeit möchte ich eine Tracking- / Verlaufstabelle wie folgt strukturieren:
- Primärschlüssel - ID
- OtherTableId - fk
- fieldName - Name des Feldes, dessen Verfolgung
- OldValue
- Neuer Wert
- Nutzername
- CreateDateTime
Im Grunde möchte ich eine Tabelle haben, die den Verlauf einer anderen Tabelle verfolgt und den Spaltennamen des geänderten Felds mit dem neuen und dem alten Wert speichert. Meine Frage ist, kann jemand Löcher in dieses stecken? Was ist der einfachste Weg, um sicherzustellen, dass nur ein Spaltenname aus den von ihm verfolgten Tabellen in die Spalte fieldName eingegeben wird? Momentan habe ich die Möglichkeit, eine Aufzählung in dem von mir erstellten Service zu haben oder eine andere Statustabelle zu erstellen und den Feldnamen zu einem fk zu machen. Irgendwelche besseren Ideen?
Ziel bearbeiten : Derzeit gibt es nur 2 Felder, die wir verfolgen möchten. Ein Feld wird auf einer Webseite angezeigt, um den Verlauf anzuzeigen, auf das andere Feld wird nur von einer Abteilung zugegriffen, und sie haben Zugriff auf eine Ansicht der Datenbank, die sie abfragen könnten. Sie würden nur dieses eine Feld abfragen, um Informationen darüber zu erhalten, wer das Feld geändert hat und wohin. Aus diesem Grund wollten wir festlegen, dass ein Datenbankfeld die Tabellenspalte definiert, anstatt eine genaue Kopie des Tabellendatensatzverlaufs zu haben. Wir wollen nur zwei Felder mit der Möglichkeit verfolgen, Felder in der Zukunft hinzuzufügen oder zu entfernen.
Vielen Dank!
Antworten:
Löcher stechen: Was passiert, wenn das Datenbankschema zu einem späteren Zeitpunkt zum gleichen Zeitpunkt geändert wird und sich der Name einer Spalte ändert oder die Spalte vollständig gelöscht wird? Viele Datenbanksysteme erlauben dies. Was passiert dann mit Ihrem "fieldName"?
Aus Gründen der Datenintegrität: Sie müssen sicherstellen, dass bei jedem Aktualisierungs- oder Löschvorgang Ihre Tracking-Tabelle auf jeden Fall aktualisiert wird. Dies geschieht am besten durch Aufrufen einer gespeicherten Prozedur durch Trigger. Sie sollten sicherstellen, dass nur diese gespeicherten Prozeduren Schreibzugriff auf Ihre Tracking-Tabelle haben, damit niemand andere falsche Werte schreiben kann.
Wenn Sie mit einer herstellerspezifischen Datenbanklösung leben können: Die meisten Datenbanksysteme verfügen über Systemtabellen, in denen die Schemainformationen (Tabellennamen, Tabellen-IDs, Spaltennamen usw.) gespeichert sind. Sie können prüfen, ob es möglich ist, eine Fremdschlüsselreferenz auf eine solche Systemtabelle zu setzen. Dies würde es ermöglichen, den Feldnamen durch eine Feld-ID zu ersetzen, wenn die Datenbank so etwas unterstützt.
Wenn Sie ganze Zeilen der Tabelle einschließlich aller Spalten (und nicht nur eine kleine Teilmenge der Spalten) nachverfolgen müssen, sollten Sie den Vorschlag von @ sarfeast in Betracht ziehen. Lesen Sie diesen Artikel über die Nachteile von Name-Wert-Paar-Modellen.
quelle
Die erfolgreichste Implementierung von Änderungsprüfungen (Verlaufsverfolgung), die ich gesehen habe, ist weniger allgemein und weitaus einfacher. Es wird eine Änderungsprotokolltabelle für jede zu überwachende Tabelle erstellt, wobei identische Spaltennamen und Datentypen (mit einer zusätzlichen Spalte für den Zeitstempel) beibehalten werden.
Das Endziel, das heißt, was Sie mit den geprüften Daten tun möchten, wird dabei helfen, die Eignung der einzelnen Ansätze zu bewerten.
quelle
Kurz gesagt: Sie müssen den Audit-Trail- Mechanismus für die Tabellen festlegen , für die Sie die Wertänderung nachverfolgen möchten.
Einzelprüfprotokolltabelle :
Hier ist ein guter Beitrag mit Skripten, wie dies erreicht werden kann - Erstellen von Audit-Trails
Weitere nützliche Hinweise zum Nachschauen:
quelle
Vielleicht möchten Sie NHibernate Envers prüfen , Projektdokumentation für Ideen.
Grundsätzlich haben Sie eine Revisionstabelle, in der Sie zusätzliche Daten wie einen Zeitstempel oder einen Benutzer hinzufügen können. Anschließend erhält jede von Ihnen verfolgte Tabelle eine zusätzliche Prüftabelle mit allen duplizierten Spalten, einem Fk für die Revisionstabelle und dem Revisionstyp (Hinzufügen, Ändern, Löschen). AFAIK, Sie möchten nicht, dass Ihre Prüftabellen eine tatsächliche FK zur realen Tabelle haben, da dies das Löschen verhindern würde.
quelle