Comment garder un audit/historique des modifications apportées à la table
J'ai été invité à créer une simple grille de données-application de style pour modifier une seule table de base de données, et c'est assez facile. Mais une partie de la demande est de créer une piste d'audit des modifications apportées, qui fait d'eux, et la date/heure.
Comment pourriez-vous résoudre ce genre de chose?
(Je vais être à l'aide de C# dans VS2008, ADO.NET connecté à SQL Server 2005, WPF et Xceed du DataGrid, si cela fait une différence.)
Voulez-vous un audit de la modification du contenu ou de la structure de la table elle-même ? Je soupçonne que tu veux dire que le contenu et pas le schéma, mais le membre de phrase "pour modifier une table d'une base de données" est un peu douteuse. Les modifications de schéma peut également être vérifiés par des déclencheurs pour info 😉
Qu'est-ce que la granularité de vérification requis? Vous pouvez le faire à n-uplet (ligne) niveau (c'est à dire un attribut est modifié, mais les utilisateurs ne sont pas intéressés dans les détails) ou à la ligne ET d'attribut (colonne) niveau (c'est à dire les utilisateurs sont intéressés à chaque modification de l'attribut). Ils impliquent un schéma différent de la conception.
En outre, même si vous êtes assuré que votre programme est le seul à accéder à cette table, présumer le contraire ou futurs changements dans les exigences va vous attraper.
Ah, oui... les bonnes questions. Pour ma part, j'ai seulement besoin de garder un historique (valeur de configuration modifié, la date/l'heure et le nom d'utilisateur) des modifications à quelques tables dans une faible base de données de circulation. Il serait nettement plus compliqué si des mises à jour ont été de plus en plus fréquentes ou il a été nécessaire à la vérification des modifications de schéma et ces.
Qu'est-ce que la granularité de vérification requis? Vous pouvez le faire à n-uplet (ligne) niveau (c'est à dire un attribut est modifié, mais les utilisateurs ne sont pas intéressés dans les détails) ou à la ligne ET d'attribut (colonne) niveau (c'est à dire les utilisateurs sont intéressés à chaque modification de l'attribut). Ils impliquent un schéma différent de la conception.
En outre, même si vous êtes assuré que votre programme est le seul à accéder à cette table, présumer le contraire ou futurs changements dans les exigences va vous attraper.
Ah, oui... les bonnes questions. Pour ma part, j'ai seulement besoin de garder un historique (valeur de configuration modifié, la date/l'heure et le nom d'utilisateur) des modifications à quelques tables dans une faible base de données de circulation. Il serait nettement plus compliqué si des mises à jour ont été de plus en plus fréquentes ou il a été nécessaire à la vérification des modifications de schéma et ces.
OriginalL'auteur ewall | 2009-11-25
Vous devez vous connecter pour publier un commentaire.
Il y a deux façons de créer des pistes d'audit.
Il y a des avantages et des inconvénients à la fois. Certaines personnes préfèrent l'un sur l'autre. C'est souvent le type d'application et le type d'utilisation de base de données, vous pouvez vous attendre.
Si vous le faites dans votre DA couche c'est à peu près jusqu'à vous. Vous avez juste besoin d'ajouter du code pour chaque méthode qui enregistre dans la base de données à sauvegarder aussi un journal des modifications. Cet audit de code pourrait être dans votre DA code de couche, ou même dans votre stockées procs dans votre base de données si vous utilisez stockées procs pour tout. Essentiellement, le principe est le même, chaque fois que vous apportez une modification à la base de données, connectez-vous de ce changement.
Si vous voulez aller en bas de la déclencheurs de la route, vous pouvez écrire des déclencheurs personnalisés pour chaque tableau, ou de la mode plus générique déclencheur qui fonctionne de la même sur beaucoup de tables. Découvrez cet article sur les déclencheurs d'audit. Cela fonctionne par un tir de déclenche à chaque fois qu'une modification est faite, et les déclencheurs enregistrer les modifications. N'oubliez pas que si vous voulez auditer les instructions SELECT, vous ne pouvez pas utiliser des déclencheurs, vous aurez à faire dans le code/proc stockée audit. Il est également important de rappeler que selon votre base de données, des déclencheurs peuvent ne pas se déclencher en toutes circonstances. Par exemple, la plupart des bases de données ne sont pas des déclencheurs au cours de TRONQUER les états. Vérifiez que vos déclencheurs virer dans tous les cas que vous avez besoin de l'audit.
Alternativement, vous pouvez aussi jeter un oeil à l'aide de la service broker faire asynchrone de l'audit sur une machine dédiée. C'est plus complexe et nécessite un peu de configuration à mettre en place.
Qui jamais vous le faites, vous devez décider sur le format du journal d'audit à prendre. Normalement vous devez enregistrer ce journal dans votre base de données, mais vous pourriez tout simplement l'enregistrer dans un fichier journal ou ce qui convient à vos exigences. Vous pourriez utiliser un seul tableau d'audit qui enregistre toutes les modifications, ou vous pourriez avoir une table d'audit par la table principale en cours de vérification. Pour les grandes implémentations vous pourriez même envisager de mettre la vérification des tables dans un cadre totalement distincte de la base de données. Si votre enregistrement dans une table, il est courant d'avoir un "changement de type" champ qui indique si les états changement a été une instruction insert, update ou delete style de changement, avec la modification de données, l'utilisateur ayant effectué la modification et la date/heure du changement a été fait. N'oubliez pas d'inclure les données anciennes et nouvelles pour la mise à jour des changements de style.
Excellent-c'est la direction que j'avais besoin. L'article sur les déclencheurs d'audit est assez bien écrit, trop (bien que j'ai dû creuser un peu pour obtenir le lien: weblogs.asp.net/jgalloway/archive/2008/01/27/... ).
Ne jamais faire aufditing inteh l'accès aux données de la couche, c'est juste des ennuis. Il y a d'autres façons de modifier les données qui doivent être enregistrées. C'est quelque chose qui DOIT être fait dans la base de données si vous wanta piste de vérification complète.
mmm.. la conception détaillée dans cet article est une Entité-Attribut-Valeur de modèle (VAE) (en.wikipedia.org/wiki/Entity-attribute-value_model). Suggestions de lecture: tonyandrews.blogspot.com/2004/10/... et simple-talk.com/opinion/opinion-pieces/bad-carma
Je pense que ce qui est important, c'est d'appliquer ces techniques à l'examen. Ni sont particulièrement adaptés à très grande échelle, de haute charge des bases de données. L'audit de code d'accès aux données peut fonctionner dans certains cas, mais vous devez tenir compte des inconvénients, qui, comme MaD70 dit, c'est qu'il est possible de contourner la vérification. Comme sage, avec un style générique de déclenchement, vous pouvez avoir des problèmes à traiter les données si le régime des changements de la piste d'audit peut plus la carte du système. Il n'y a pas de meilleure façon, mais vous avez juste besoin d'examiner attentivement chaque, il y a plusieurs bonnes réponses ici.
OriginalL'auteur Simon P Stevens
La plupart de méthode universelle serait de créer une autre table pour stocker les versions de l'enregistrement de la première table. Ensuite, vous pouvez supprimer toutes les données de la table principale. Supposons que vous avez besoin gestion des versions d'une table Personne(PersonId, Nom, Prénom):
Maintenant tout changement nécessite l'insertion de nouveaux PersonVersion et la mise à jour de la CurrentPersonVersionID.
OriginalL'auteur PanJanek
Idem utiliser des déclencheurs.
Toute personne qui envisage la suppression logicielle devrait avoir une lecture de Richard Dingwall le problème avec Le soft de supprimer.
Merci pour le partage de cet article. M'a fait réaliser que l'une de nos application d'une utilisation plus souple de la supprimer nécessite encore un développeur pour créer un script pour effectuer annule le marquage. Aucun bénéfice tangible pour l'utilisateur final.
OriginalL'auteur martin clayton
La meilleure façon de le faire est de configurer les déclencheurs de la base de données que d'écrire à la vérification des tables.
Un audit de la table ,très mauvaise idée. Vous obtiendrez des problèmes de verrouillage sur les plaquettes avec de nombreux utilisateurs que tout va aller à la table.
OriginalL'auteur HLGEM
J'ai récemment été confronté à une obligation de vérification des tables et j'ai opté pour l'utilisation de déclencheurs. Comme d'autres, je voulais seulement voir les entrées dans la table d'audit de ces champs qui avait réellement changé, cependant, lorsque vous mettez à jour les tableaux, l'application a été mise à jour tous les champs de la ligne qu'ils avaient changé ou pas, par conséquent, de vérifier si les champs ont été mis à jour ou pas ne m'a rien - ils avaient tous!
Ce que je voulais, donc, était une méthode de vérification de la valeur réelle de chaque champ pour voir s'il a changé ou non, et non seulement de les écrire sur le tableau d'audit si elle avait. Ayant été incapable de trouver une solution à cette énigme n'importe où, je suis venu avec mes propres, comme suit:
Comme vous pouvez le voir, je suis en comparant les valeurs de chaque champ dans le supprimé et inséré tables et seulement de l'écriture de la valeur de champ de la table insérée à la table d'audit s'ils sont différents, sinon je viens de l'écrire NULLE.
Certainement, cela fonctionne pour moi. Quelqu'un peut-il voir des problèmes avec cette approche? Mon équipe propre à la fois l'application et la base de données si possible courbe de boules comme les modifications de schéma sont prises en compte.
OriginalL'auteur Jon White
L'autre façon de faire cela en dehors de déclencheurs est-ce,
UpdFlag
,DelFlag
,EffectiveDate
etTerminatedDate
pour chaque table que vous voulez faire une piste de vérification.TerminatedDate
à la date qui a été mis à jour, et marque le UpdFlag et à mettre dans le datetime dans la colonneEffectiveDate
et laTerminatedDate
définir un max de date.De même, si vous voulez faire une suppression de la ligne, il suffit de mettre à jour la ligne de marquage de la
DelFlag
comme indiqué, leTerminatedDate
avec datetime maintenant. Vous êtes en effet de faire un soft supprimer et non d'une sql Delete.De cette façon, quand vous voulez pour la vérification de données, et de montrer une trace des modifications, il vous suffit de filtrer les lignes pour ceux qui ont la
UpdFlag
ensemble, ou entreEffectiveDate
etTerminatedDate
. De même pour ceux qui ont été supprimés, vous filtrez pour ceux qui ont laDelFlag
ensemble ou entreEffectiveDate
etTerminatedDate
. Pour les lignes en cours, de filtrer les lignes qui ont les deux drapeaux mis hors tension. L'avantage est que vous n'avez pas à créer une autre table pour la vérification lorsque le déclencheur est utilisé!C'est vrai, mais la sécurité est appliquée par le même itinéraire et impose l'utilisation d'une telle demande de le faire. En contournant sprocs qui à mon humble avis qui seraient considérées comme une violation de la sécurité - comme, pourquoi devrait-il être contourné, ce qui est contraire au point d'un audit? Merci pour vos commentaires et cela m'a donné de la nourriture pour la pensée! 😉 Prenez soin de vous!
Tommie, si je fais une mise à jour de tous les records pour un client particulier, je ne vais pas utiliser certaines procédures stockées utilise l'application et l'exécuter ina boucle de 100 000 fois. Ni vais-je l'utiliser pour l'importation des données, ni des gens qui essaient de commettre une fraude ou tout simplement de tenter de détruire des données, car ils sont en colère.
vous êtes les bienvenus. Dans la vraie vie, le risque que personne ne va se rappeler (ou gauche) pour faire appliquer une telle implicite politique est élevé, il est donc préférable de le mettre dans la DB et de laisser le SGBD appliquer (accompagnement appropriées documentation de conception est également recommandé).
OriginalL'auteur t0mm13b
J'irais déclencheurs de la route, par la création de la table avec une structure similaire à la mise à jour, avec des colonnes supplémentaires pour le suivi des modifications comme ModifiedAt etc. Et puis les ajouter sur le déclencheur de mise à jour qui permettra d'insérer les modifications apportées à la table.
Je le trouve plus facile à entretenir que d'avoir tout dans le code de l'application. Bien sûr, beaucoup de gens ont tendance à oublier déclenche quand il s'agit de questions comme "wtf cette table est en train de transformer";) Cheers.
OriginalL'auteur pablox