Existe-t-il un moyen indépendant de la base de données d'obtenir des notifications de modification de données au niveau du terrain?

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

  •  10-07-2019
  •  | 
  •  

Question

Actuellement, avec SQL Server 2005, j'interroge un " événement Windows " base de données pour déterminer les modifications dans une table appelée WINDOWS_EVENTS, qui comporte un champ d'horodatage. En regardant l'horodatage, je peux déterminer si la ligne a changé, mais pas quel champ de cette ligne a été modifié.

Existe-t-il des solutions génériques (c'est-à-dire indépendantes de la base de données) pour détecter les modifications au niveau du champ? (J'ai besoin que ce soit générique, car rien ne permet de savoir quelle base de données un client utiliserait. Je ne souhaite donc pas utiliser Notification Services ni une autre technologie spécifique à SQL Server. Je pourrais utiliser n'importe quelle solution, .NET, Java ou n'importe quelle autre solution. autre langue si cela m’aide à résoudre mon problème.)

Était-ce utile?

La solution

Tout d'abord, je vous recommanderais de modifier la structure de votre table à partir de quelque chose comme ceci:

id      field1   field2   field3   field4   timestamp

dans quelque chose comme ça:

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

Deuxièmement, vous pouvez obtenir ce que vous voulez en copiant l'ancienne valeur ou en calculant le hachage des valeurs de champ (pour les champs longs) et en les stockant dans un autre champ (oldField1, oldField2, etc.) avec l'horodatage, puis interroger la table. Je crois que toutes les bases de données ont une fonction de hachage, comme SHA1 ('xyz') ou MD5 ('abc'), même si elles ont un nom légèrement différent.

Lorsque vous interrogez la table sur les modifications, vous voyez la ligne qui a été modifiée et vous pouvez effectuer une comparaison champ par champ pour déterminer le champ modifié. Donc, vous compareriez field1 à oldField1, field2 à oldField2, field3 à oldField3, etc. Pour les blobs, vous pouvez comparer SHA1 (field4) à oldField4).

Créez un déclencheur de procédure stockée pour copier les champs lorsque vous mettez à jour l'horodatage.

Une autre solution consiste à créer une table de journal des modifications de données qui ne stocke que les modifications. Il serait inséré dans une procédure stockée de déclenchement et ressemblerait à ceci

id    tableName       rowKey    fieldName     oldValue     newValue     timestamp
1     WINDOWS_EVENTS  42        event1        stable       crash        4:44am
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top