2008-09-01 12 views
25

Wie können Änderungen in einer Datenbanktabelle am besten verfolgt werden?So verfolgen Sie Datenänderungen in einer Datenbanktabelle

Stellen Sie sich vor Sie haben eine Anwendung, in der Benutzer (im Kontext der Anwendung nicht DB-Benutzer) Daten ändern können, die in einer Datenbanktabelle gespeichert sind. Was ist der beste Weg, um einen Verlauf aller Änderungen zu verfolgen, so dass Sie zeigen können, welcher Benutzer zu welcher Zeit welche Daten wie ändern?

+2

Einige gute Diskussion hier: http://discuss.joelonsoftware.com/default.asp?design.4.483891 .10 –

+0

Siehe auch [Das beste Design für eine Changelog-/Audit-Datenbanktabelle?] (Https://stackoverflow.com/questions/201527/best-design-for-a-changelog-auditing-dabatta-table) – user

Antwort

3

Wenn Ihre Anwendung in Schichten strukturiert ist, muss die Datenzugriffsebene im Allgemeinen eine gespeicherte Prozedur auf Ihrem Datenbankserver aufrufen, um ein Protokoll der Datenbankänderungen zu schreiben.

In Sprachen, die so etwas unterstützen aspect-oriented programming kann eine gute Technik für diese Art von Anwendung zu verwenden. Das Überprüfen von Änderungen an der Datenbanktabelle ist die Art von Vorgang, die normalerweise für alle Vorgänge protokolliert werden soll. Daher kann AOP sehr gut funktionieren.

Bedenken Sie, dass das Protokollieren von Datenbankänderungen viele Daten erzeugt und das System verlangsamt. Je nach Größe der Anwendung kann es sinnvoll sein, eine Nachrichtenwarteschlangenlösung und eine separate Datenbank zur Ausführung des Überwachungsprotokolls zu verwenden.

Es ist auch durchaus möglich, gespeicherte Prozeduren zu verwenden, um dies zu handhaben, obwohl es ein wenig Arbeit mit der Übergabe von Benutzeranmeldeinformationen an die Datenbank selbst sein kann.

+1

Es scheint so Wenn Sie dem Benutzer erlauben möchten, seinen eigenen Verlauf oder den Verlauf anderer Personen anzuzeigen, wäre eine Protokolldatei für sie nicht sehr zugänglich. –

3

Sie haben hier ein paar Probleme, die sich nicht gut aufeinander beziehen.

Auf der Basis-Datenbank-Ebene können Sie Änderungen verfolgen, indem Sie eine separate Tabelle haben, die einen Eintrag über Trigger für INSERT/UPDATE/DELETE-Anweisungen erhält. Dies ist die allgemeine Methode zum Verfolgen von Änderungen an einer Datenbanktabelle.

Die andere Sache, die Sie wollen, ist zu wissen, welche Benutzer die Änderung vorgenommen hat. Im Allgemeinen würden deine Auslöser das nicht wissen. Ich nehme an, dass, wenn Sie wissen möchten, welcher Benutzer ein Stück Daten geändert hat, es möglich ist, dass mehrere Benutzer die gleichen Daten ändern können.

Es gibt keinen richtigen Weg, dies zu tun, Sie werden wahrscheinlich eine separate Tabelle haben, in die Ihr Anwendungscode einen Datensatz einfügen wird, wenn ein Benutzer einige Daten in der anderen Tabelle aktualisiert, einschließlich Benutzer, Zeitstempel und ID von die geänderte Aufzeichnung.

Stellen Sie sicher, dass Sie eine Transaktion verwenden, damit Sie nicht mit Fällen fertig werden, in denen das Update ohne die Einfügung durchgeführt wird. Wenn Sie die umgekehrte Reihenfolge verwenden, endet die Einfügung ohne Aktualisierung.

0

Ein Trace-Protokoll in einer separaten Tabelle (mit einer ID-Spalte, möglicherweise mit Zeitstempeln)?

Wollen Sie auch die Änderungen rückgängig machen - vielleicht die UNDO-Anweisung (ein DELETE für jedes INSERT, ein (Un-) UPDATE für jedes normale UPDATE) erstellen und das im Trace speichern?

4

Eine Methode, die ich oft gesehen habe, ist Audit-Tabellen zu haben. Dann können Sie zeigen, was sich geändert hat, was sich geändert hat und was es verändert hat oder was auch immer Sie wünschen :) Dann könnten Sie einen Auslöser für die eigentliche Protokollierung schreiben. Nicht zu schmerzhaft, wenn es richtig gemacht wird ...

Egal wie Sie es tun, hängt es jedoch davon ab, wie Ihre Benutzer mit der Datenbank verbinden. Verwenden sie einen einzelnen Anwendungsbenutzer über einen Sicherheitskontext innerhalb der App, stellen sie eine Verbindung mit ihren eigenen Konten in der Domäne her, oder verbindet die App einfach alle mit einem generischen SQL-Konto?

Wenn Sie die Benutzerinformationen nicht aus der Datenbankverbindung abrufen können, ist es ein wenig mühsamer. Und dann können Sie sich die Protokollierung in der App ansehen. Wenn Sie also einen Prozess namens "CreateOrder" oder was auch immer haben, können Sie sich in die Order_Audit-Tabelle oder was auch immer einloggen.

Alles innerhalb der App zu tun öffnet sich ein wenig mehr auf Änderungen von außerhalb der App gemacht, aber wenn Sie mehrere Anwendungen haben alle mit den gleichen Daten und Sie wollten nur sehen, welche Änderungen von Ihrem gemacht wurden, vielleicht das ist, was Sie wollten ... < shrug>

Viel Glück für Sie, obwohl!

--Kevin

1

In derselben Frage der Erforschung, fand ich eine Diskussion here sehr nützlich. Es schlägt vor, eine parallele Tabelle für das Verfolgen von Änderungen zu haben, wobei jede Änderungsverfolgungstabelle die gleichen Spalten wie das, was sie verfolgt, sowie Spalten darüber enthält, wer sie geändert hat, wann und ob sie gelöscht wurde. (Es sollte das Schema für diese mehr oder weniger automatisch möglich sein, zu erzeugen, indem eine regexed-up-Version Ihrer bereits bestehenden Skripten.)

+0

Ja - das ist eine sehr gute Einführung/Tutorial –

0

Lassen Sie uns versuchen, mit dieser Open-Source-Komponente:

https://tabledependency.codeplex.com/

TableDependency ist eine generische C# -Komponente, die zum Empfangen von Benachrichtigungen verwendet wird, wenn sich der Inhalt einer angegebenen Datenbanktabelle ändert.

-1

Wenn alles von PHP geändert wird. Sie können class verwenden, um evry INSERT/UPDATE/DELETE vor der Abfrage zu protokollieren. Es wird, Tisch, Spalte, newValue, oldValue, Datum, System (falls notwendig) speichern Aktion sein, ip, Useragent, clumnReference, operatorReference, valueReference. Alle Tabellen/Spalten/Aktionen, die protokolliert werden müssen, sind konfigurierbar.

1

Angenommen, ich habe eine Personentabelle mit 10 Spalten, die PersonSid und UpdateDate enthalten. Jetzt möchte ich alle Aktualisierungen in der Personentabelle verfolgen.Hier ist die einfache Technik, die ich verwendet:

  1. erstellen person_log Tabelle

    Tabelle person_log (Datum datetime2, sid int) schaffen;

  2. einen Trigger auf Tabelle Person erstellen, die eine Zeile in person_log Tabelle einfügen wird, wenn Person Tabelle aktualisiert wird:

    create trigger tr auf dbo.Person
    in person_log
    als Einsatz für Update (Datum, sid) wählt updatedDTTM, personSID aus eingefügt

nach Aktualisierungen abfragen person_log Tisch und Sie werden in der Lage sein personSid, um zu sehen, die aktualisiert wurde. Das Gleiche können Sie für Einfügen, Löschen tun.

Obiges Beispiel für SQL ist, lassen Sie mich bei allen Fragen kennen oder diesen Link: http://www.4guysfromrolla.com/webtech/042507-1.shtml

Verwandte Themen