Datenbankverlaufstabelle / Tracking-Tabelle


13

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!


Wissen Sie im Voraus, wie viele Tabellen Sie verfolgen werden?
Kofi Sarfo

Diese Tabelle verfolgt nur eine andere Tabelle. Bisher verfolgen wir nur diese eine Tabelle.
user76982

Dieser Ansatz könnte also übertrieben sein. Noch schlimmer ist, dass es nicht einfach ist, diese Tabelle zusammen mit der zu überwachenden Tabelle abzufragen, um die Live-Daten zu einem bestimmten Zeitpunkt wiederherzustellen, sollte die Neuerstellung eines Schnappschusses von beliebigem Wert sein.
Kofi Sarfo

1
Auf der anderen Seite ist die Abfrage, welche Spalten sich am häufigsten ändern, mit dem von Ihnen vorgeschlagenen Ansatz einfacher.
Kofi Sarfo

Vielleicht möchten Sie nach dba.stackexchange.com suchen . Dort wurden ähnliche Fragen gestellt, und einige haben möglicherweise Antworten, die Sie verwenden können.
FrustratedWithFormsDesigner

Antworten:


8

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.


8

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.


Hallo Sarfeast, ich habe das Endziel hinzugefügt, das ich erreichen möchte. Entschuldigen Sie, dass Sie dies nicht mit einbeziehen.
user76982

Dieser Ansatz hat seine Nachteile. Lesen Sie hier: database-programmer.blogspot.co.uk/2008/07/history-tables.html
Tuukka Haapaniemi

7

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 :

Erstellen Sie eine Tabelle, um den Tabellennamen, den Feldnamen und die alten und neuen Versionen der Daten zu protokollieren. Für diese Methode ist es üblich, sowohl alte als auch neue Versionen der Daten und nur die Felder zu protokollieren, die sich geändert haben. Um dies in Triggern zu implementieren, muss entweder ein Primärschlüssel in der Tabelle vorhanden sein oder es müssen nur einzelne Zeilen aktualisiert werden.

Hier ist ein guter Beitrag mit Skripten, wie dies erreicht werden kann - Erstellen von Audit-Trails

Weitere nützliche Hinweise zum Nachschauen:


Zweiter Link ist jetzt schlecht.
Jeremy Harris

@cillosis, Danke, dass du das bemerkt hast. Es ist jetzt aktualisiert :)
Yusubov

3

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.