So verfolgen Sie Datenänderungen in einer Datenbanktabelle
Was ist der beste Weg, um track-änderungen in einer Datenbank-Tabelle?
Stell dir vor du hast eine Anwendung, in der Nutzer (im Kontext der Anwendung nicht DB-Benutzer ) verändern können Daten, die Sie speichern in einer Datenbank-Tabelle. Was ist der beste Weg, um eine Historie aller änderungen, so dass Sie können zeigen, welche Benutzer zu welchem Zeitpunkt ändern sich die Daten wie?
InformationsquelleAutor der Frage user3711 | 2008-09-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Allgemeinen, wenn Ihre Anwendung ist strukturiert in Layern, die data access tier aufrufen einer gespeicherten Prozedur auf dem Datenbankserver zu schreiben, ein Protokoll von änderungen in der Datenbank.
In Sprachen, die so etwas unterstützen Aspekt-orientierte Programmierung kann eine gute Technik zu verwenden, die für diese Art von Anwendung. Das Auditing-Datenbank-Tabelle ändert, ist die Art der operation, werden Sie in der Regel ist die Anmeldung für alle Operationen, so AOP arbeiten können, sehr schön.
Beachten Sie, dass die Protokollierung von Datenbankänderungen erstellen viele Daten und verlangsamen das system herunter. Es kann sinnvoll sein, eine message-queue-Lösung und einer separaten Datenbank, führen Sie die audit-log, abhängig von der Größe der Anwendung.
Es ist auch durchaus möglich, gespeicherte Prozeduren verwenden, um diese zu bewältigen, obwohl es ein bisschen Arbeit beteiligt übergeben von Anmeldeinformationen über die Datenbank selbst.
InformationsquelleAutor der Antwort Jeremy McGee
Eine Methode, die ich gesehen habe sehr oft ist zu haben-audit-Tabellen. Dann können Sie zeigen, was sich verändert, was hat sich geändert und was es geändert, oder was immer Ihr Herz begehrt 🙂 Dann könnte man schreiben, einen trigger, um die eigentliche Anmeldung. Nicht zu schmerzhaft, wenn es richtig gemacht wird...
Egal, wie Sie es tun, obwohl, es hängt davon ab, wie Ihre Benutzer mit der Datenbank verbinden. Verwenden Sie eine einzelne Anwendung Anwender über eine security-Kontext innerhalb der app, werden Sie anschließen mit Ihren eigenen Konten, die auf die domain, oder muss die app einfach haben, jeder verbindet mit einem generischen sql-Konto?
Wenn Sie nicht in der Lage, um die Benutzer-info aus der Datenbank-Verbindung, es ist ein wenig mehr Schmerzen. Und dann könnten Sie schauen, tun Sie das logging innerhalb der app, also, wenn Sie einen Prozess namens "CreateOrder" oder was auch immer, Sie können sich auf die Order_Audit Tabelle oder was auch immer.
Tun es alle innerhalb der app öffnet sich ein wenig mehr um änderungen außerhalb der app, aber wenn Sie mehrere apps, die alle die gleichen Daten, und Sie wollte nur sehen, welche änderungen vorgenommen wurden, von dir, vielleicht ist das, was Sie wollte... <Schulterzucken>
Viel Glück für Sie, obwohl!
--Kevin
InformationsquelleAutor der Antwort Kevin Fairchild
Du hast ein paar Fragen hier, die nicht gut beziehen sich auf einander.
In der basic-Datenbank-Ebene können Sie änderungen verfolgen, indem er eine separate Tabelle, wird ein Eintrag Hinzugefügt, um es über Trigger auf INSERT/UPDATE/DELETE-Anweisungen. Das ist die Allgemeine Möglichkeit der Nachverfolgung von änderungen an einer Datenbank-Tabelle.
Die andere Sache, die Sie wollen, ist zu wissen, welche Benutzer die änderung vorgenommen. In der Regel Ihre Auslöser nicht kennen würden. Ich gehe davon aus, dass, wenn Sie wissen möchten, welche Benutzer verändert ein Stück von Daten, dann ist es möglich, dass mehrere Benutzer ändern könnte, die gleichen Daten.
Gibt es keine richtige Weg, dies zu tun, werden Sie wahrscheinlich wollen, um eine separate Tabelle, die Ihre Anwendung code fügt einen Datensatz in ein, wenn ein Benutzer updates, die einige Daten in der anderen Tabelle, einschließlich Benutzer, Zeitstempel und id des geänderten Datensatzes.
Stellen Sie sicher, dass Sie eine Transaktion, so dass Sie am Ende nicht mit den Fällen, wo das update gemacht wird ohne den Einsatz, oder wenn Sie das Gegenteil tun, um Sie nicht am Ende mit einfügen, ohne das update.
InformationsquelleAutor der Antwort thelsdj
In der Erforschung dieses gleiche Frage, ich fand eine Diskussion hier sehr nützlich. Es schlägt vor, dass eine parallel-Tabelle für die Nachverfolgung von änderungen, wobei jedes change-tracking-Tabelle hat dieselben Spalten wie das, was es ist-tracking-plus-Spalten, für die es geändert, wenn, und wenn es gelöscht wurde. (Es sollte möglich sein, um das schema zu generieren, die für diese mehr-oder-weniger, indem automatisch eine regexed-up-version Ihre bereits vorhandenen Skripts.)
InformationsquelleAutor der Antwort TomNysetvold
Angenommen ich habe eine Personen-Tabelle mit 10 Spalten, die gehören PersonSid und UpdateDate. Nun, ich möchte, um zu verfolgen alle updates in der Person-Tabelle.
Hier ist die einfache Technik, die ich verwendet habe:
Erstellen Sie eine person_log Tabelle
create table person_log(Datum, datetime2, sid int);
Erstellen Sie einen trigger auf die Person-Tabelle wird eine Zeile einfügen in person_log Tabelle, wenn die Person-Tabelle wird aktualisiert:
create trigger tr auf dbo.Person
für update
als
insert into person_log(Datum, sid) wählen Sie updatedDTTM, PersonSID von eingefügt
Nachdem alle updates, Abfrage person_log Tabelle, und Sie werden in der Lage, um zu sehen, personSid, die aktualisiert wurde.
Gleichen Sie tun können, um Insert, delete.
Obigen Beispiel ist für SQL, lassen Sie mich wissen, im Falle von Fragen oder nutzen Sie diesen link :
http://www.4guysfromrolla.com/webtech/042507-1.shtml
InformationsquelleAutor der Antwort S'chn T'gai Spock
Einem trace-log in einer separaten Tabelle (mit einer ID-Spalte, ggf. mit Zeitstempel)?
Sind Sie gehen zu wollen, um die änderungen rückgängig machen, als auch - vielleicht vor erstellen des undo-Anweisung (DELETE für jede INSERT -, ein (un-) UPDATE für jeden normalen UPDATE) und speichern, die in der Spur?
InformationsquelleAutor der Antwort Unsliced
Lassen Sie uns versuchen, mit diesem open-source-Komponente:
https://tabledependency.codeplex.com/
TableDependency ist einer generischen C# - Komponente verwendet, um Benachrichtigungen zu erhalten, wenn der Inhalt von einer angegebenen Datenbank-Tabelle ändern.
InformationsquelleAutor der Antwort Christian Del Bianco
Wenn alle änderungen von php. Sie dürfen Klasse anmelden evry INSERT/UPDATE/DELETE-before query. Es wird speichern Sie AktionTabelleSpaltenewValueoldValueDatumsystem(wenn nötig), ip -UserAgentclumnReferenceoperatorReferencevalueReference. Alle Tabellen/Spalten/Aktionen müssen protokolliert werden, sind konfigurierbar.
InformationsquelleAutor der Antwort moledet