2009-08-03 4 views
0

Actuellement, en utilisant SQL Server 2005, j'interroge une base de données "événements Windows" pour déterminer les modifications dans une table appelée WINDOWS_EVENTS, qui possède un champ d'horodatage. En regardant l'horodatage je peux déterminer si la ligne a changé, mais pas quel champ dans cette rangée a changé.Existe-t-il une manière indépendante de la base de données d'obtenir des notifications de changement de données au niveau du champ?

Existe-t-il un moyen générique (c'est-à-dire indépendant de la base de données) pour détecter les changements de niveau de champ? (J'ai besoin que ce soit générique, car il n'y a aucune indication sur la base de données qu'un client utiliserait, donc je ne veux pas utiliser Notification Services ou toute autre technologie spécifique à SQL Server.Je pourrais utiliser n'importe quelle solution, .NET, Java ou . toute autre langue si cela me aide à résoudre mon problème)

+0

Ionno, mais si vous voulez qu'il soit indépendant de la base de données, il semble que vous aurez besoin d'un ORM. – mpen

+0

@Mark, ce que je dois être possible avec nHibernate par exemple? De plus, je ne suis pas sûr qu'un ORM convienne à une table avec environ 100 000 enregistrements à la fois (pas plus de 100 000). – Liao

Répondre

0

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

id  field1 field2 field3 field4 timestamp 

en quelque chose comme ceci:

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ème , vous pouvez réaliser ce que vous voulez par copie en utilisant l'ancienne valeur ou en calculant le hachage des valeurs de champs (pour les champs longs) et en les stockant dans un autre champ (oldField1, oldField2, etc.) avec l'horodatage, puis interrogez la table. Je crois que toutes les bases de données ont une fonction de hachage, comme SHA1 ('xyz') ou MD5 ('abc'), bien qu'il puisse avoir un nom légèrement différent dans chacune d'entre elles.

Ensuite, lorsque vous interrogez la table pour des modifications, vous voyez la ligne qui a changé, et vous pouvez faire un champ par comparaison de champs pour trouver quel champ a changé. Ainsi, vous pouvez comparer 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 de modification de données qui ne stocke que les modifications. Il serait inséré dans via une procédure stockée de déclencheur, et il ressemblerait à ceci:

id tableName  rowKey fieldName  oldValue  newValue  timestamp 
1  WINDOWS_EVENTS 42  event1  stable  crash  4:44am 
Questions connexes