Gibt es eine Datenbank-unabhängige Art und Weise Daten erhalten Benachrichtigungen auf der Feldebene ändern?

StackOverflow https://stackoverflow.com/questions/1221106

  •  10-07-2019
  •  | 
  •  

Frage

Derzeit SQL Server 2005 abfragen mir eine „Fenster Ereignisse“ Datenbank, um zu bestimmen Änderungen in einer Tabelle WINDOWS_EVENTS genannt, die ein Zeitstempel-Feld hat. Mit Blick auf den Zeitstempeln ich feststellen kann, ob die Zeile geändert, aber nicht das, was Feld in dieser Zeile geändert.

Gibt es eine generische (das heißt Datenbank unabhängige Art und Weise) Feldebene Änderungen zu erkennen? (Ich brauche es generisch zu sein, denn es gibt nicht abzusehen ist, welche Datenbank ein Kunde verwenden würde, so will ich nicht Notification Services oder anderen SQL-Server-spezifische Technologie verwenden. Ich jede Lösung verwenden könnte, .NET, Java oder irgendeine andere Sprache, wenn das hilft ich mein Problem zu lösen.)

War es hilfreich?

Lösung

Als erstes würde ich empfehlen, Ihre Tabellenstruktur von etwa wie folgt zu ändern:

id      field1   field2   field3   field4   timestamp

in etwa so aus:

Table 1
-------
id     fieldKey    value    timestamp
1      1           42       12:03am
2      3           'Cow'    1:45am
3      2           'Moo'    2:33am
4      4           99       3:59am

Table 2
-------
fieldKey     fieldLabel
1            Field One
2            Field Two
3            Event One
4            Event Two

Zweitens können Sie erreichen, was Sie wollen von dem alten Wert zu kopieren oder den Hash des Feldwertes (für lange Felder) zu berechnen und sie in einem anderen Feld (oldField1, oldField2, etc.) zusammen mit dem Zeitstempel zu speichern, dann Umfrage die Tabelle. Ich glaube, alle Datenbanken haben eine Hash-Funktion, wie SHA1 ( ‚xyz‘) oder MD5 ( ‚abc‘), obwohl es einen etwas anderen Namen in jedem haben könnte.

Wenn Sie dann die Tabelle für Änderungen abfragen, sehen Sie die Zeile, die geändert hat, und Sie können ein Feld für Feld Vergleich tun, um herauszufinden, welches Feld verändert hat. So würden Sie vergleichen field1 bis oldField1, field2 zu oldField2, field3 zu oldField3, etc. Für Blobs, könnten Sie SHA1 vergleichen (field4) zu oldField4).

Erstellen Sie eine gespeicherte Prozedur Trigger, die Felder zu kopieren, wenn Sie den Zeitstempel aktualisieren.

Eine andere Lösung ist es, eine Datenänderungsprotokoll-Tabelle nur die Änderungen speichert, die zu erstellen. Es würde über einen Trigger gespeicherte Prozedur eingefügt wird in, und es würde so aussehen

id    tableName       rowKey    fieldName     oldValue     newValue     timestamp
1     WINDOWS_EVENTS  42        event1        stable       crash        4:44am
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top