La création de déclencheurs d'audit dans SQL Server
J'ai besoin pour mettre en œuvre le suivi des modifications sur deux tables dans ma base de données SQL Server 2005. J'ai besoin de vérification des ajouts, des suppressions, des mises à jour (avec détail sur ce qui a été mis à jour). Je comptais sur l'aide d'un déclencheur pour ce faire, mais après avoir farfouillé sur Google j'ai trouvé que c'était très facile de faire une erreur, et je voulais éviter que sur l'obtenir-aller.
Quelqu'un peut-il poster un exemple de déclencheur de mise à jour qui accomplit avec succès, et dans une élégante manière? Je suis l'espoir de se retrouver avec une table d'audit avec la structure suivante:
- ID
- LogDate
- TableName
- TransactionType (update/insert/delete)
- RecordID
- FieldName
- OldValue
- NewValue
... mais je suis ouvert aux suggestions.
Merci!
- Suivez ci-dessous le lien: stackoverflow.com/questions/1906753/...
- J'ai trouvé une procédure stockée qui va générer des instructions insert, update, delete les déclencheurs et la table d'audit. codeproject.com/Articles/21068/...
Vous devez vous connecter pour publier un commentaire.
Je veux juste pour appeler quelques points:
Utiliser des générateurs de code Vous ne pouvez pas avoir une seule procédure à suivre toutes les tables, vous aurez besoin de générer similaire mais distinct des déclencheurs sur chaque table de suivi. Ce genre de travail est le mieux adapté pour automatiser la génération de code. À votre place, je voudrais utiliser une transformation XSLT pour générer le code à partir de XML et XML peuvent être générées automatiquement à partir des métadonnées. Cela vous permet de gérer facilement les déclencheurs par les régénérer à chaque fois que vous apportez une modification à la vérification de la logique ou de la structure ou une table cible est ajouté/modifié.
Envisager la planification de la capacité pour la vérification. Une table d'audit permettant de suivre tous les changements de la valeur sera, de loin, la plus grosse table dans la base de données: il contiendra toutes les données actuelles et les
toute l'histoire de l'actuel des données. Ce tableau permettra d'augmenter la taille de base de données de 2 à 3 ordres de grandeur (x10, x100). Et la table d'audit va rapidement devenir le goulot d'étranglement de tout:
Prendre en compte la les modifications de schéma. Une table nommée 'Foo' peut être supprimée et, plus tard, une autre table nommée 'Foo' peut être créé. La piste d'audit doit être capable de distinguer les deux objets différents. Vaut mieux utiliser un lent de changer de dimension approche.
Envisager la nécessité de efficacement supprimer des enregistrements d'audit. Lorsque la période de rétention dictée par votre application sous réserve des politiques est dû, vous devez être en mesure de supprimer la cause des enregistrements d'audit. Il peut ne pas sembler une grosse affaire maintenant, mais 5 ans plus tard, quand les premiers enregistrements sont dus la table d'audit a augmenté à 9,5 TUBERCULOSE, il peut être un problème.
Envisager la nécessité de requête de la vérification. La table d'audit de la structure doit être prêt à répondre efficacement aux requêtes de l'audit. Si votre audit ne peut pas être interrogé alors qu'il n'a pas de valeur. Les requêtes seront entièrement due à vos exigences et vous seul savez le faire, mais la plupart des enregistrements d'audit sont interrogés pour des intervalles de temps ("quels changements ont eu lieu entre 7h et 8h hier?'), par objet ("quels changements ont eu lieu à cet enregistrement dans cette table?') ou par l'auteur ("quels changements avez-Bob dans la base de données?').
Nous utilisons ApexSQL Audit qui génère des déclencheurs d'audit et ci-dessous sont des structures de données utilisées par cet outil. Si vous n'avez pas l'intention sur l'achat d'un 3ème partie de la solution, vous pouvez installer cet outil en mode d'essai, voir comment ils ont mis en œuvre des déclencheurs et de stockage, puis de créer quelque chose de similaire pour vous-même.
Je n'ai pas pris la peine d'entrer dans trop de détails sur la façon dont ces tables de travail mais j'espère que cela vous permettra de commencer.
Il n'existe pas de méthode générique permettant de le faire de la manière que vous voulez. Finalement, vous finissez par écrire des bouts de code pour chaque table. Sans oublier qu'il peut être fée lent si vous avez besoin de comparer chaque colonne pour le changement.
Aussi le fait que vous pourriez être à jour plusieurs lignes en même temps implique que vous avez besoin pour ouvrir un curseur pour faire une boucle sur tous les enregistrements.
Je ferais ça sera l'aide de la table dont la structure est identique pour les tables de suivi et unpivot plus tard pour afficher les colonnes ont réellement changé. Je voudrais aussi garder une trace de la session qui a vraiment fait le changement. Cela suppose que vous avez la clé primaire dans la table en cours de suivi.
Donc, étant donné un tableau comme celui
Je voudrais créer une table d'audit de ce genre dans l'audit schmea.
Et un déclencheur pour la mise à Jour comme ceci
Cela va assez vite. Pendant la rédaction du rapport , il vous suffit de rejoindre les lignes en fonction de sessionID, et la clé Primaire et de produire un rapport. Alternativement, vous pouvez avoir un travail par lots qui périodiquement passe par toutes les tables dans la table d'audit et de préparer une paire nom-valeur indiquant les changements.
HTH
Ça a l'air simple et devrait bien fonctionner jusqu'à ce que vous avez de l'image/varbinary etc éléments dans vos tables
Vous avez tout ancien record et le tout nouvel enregistrement au format xml.
Il devrait également travailler correctement pour l'insertion de plusieurs colonnes en 1 lot.
Et de déclencher code
SORTIE
Je vais me jeter dans mon approche et des suggestions pour le mélange.
J'ai très semblable à la table de votre projet de la conception que j'ai utilisé pour les sept dernières années sur un SQL 2005 (maintenant 2008) de la base de données.
J'ai ajouté insérer, mettre à jour et supprimer des déclencheurs pour des tables sélectionnées, puis vérifié pour les changements de champs sélectionnés. À l'époque c'était simple et fonctionne bien.
Ici les questions que j'ai trouver avec cette approche:
La table d'audit de l'ancienne et de la nouvelle valeur du champs devaient être de type varchar(MAX) types pour être en mesure de faire face à toutes les valeurs qui pourraient être vérifiés: int,bool,décimal,float,varchar, etc. tous ont pour s'adapter à
Le code de vérification pour chaque champ est fastidieux à écrire un maintenir. Il est également facile de manquer des choses (comme la modification d'un champ nul pour une valeur de ne pas se faire attraper, parce que NULL != la valeur est NULL.
Supprimer un enregistrement: comment voulez-vous enregistrer ce? Tous les champs? Ceux qui sont sélectionnés? Il devient compliqué
Ma vision pour l'avenir est d'utiliser SQL CLR code et écrire une generic trigger est exécuté et les chèques de table de méta-données pour voir ce que d'audit. Deuxièmement, les Nouvelles/Anciennes valeurs seront convertis en champs XML et l'ensemble de l'objet enregistré: il en résulte plus de données, mais supprimer a tout un album. Il y a plusieurs articles sur le web à propos de XML déclencheurs d'audit.
Déclencheur est utilisé pour Si vous les modifier ou de les insérer dans un tableau particulier, ce sera execute, et vous pouvez vérifier le particulier de la colonne de déclenchement. Exemple complet avec explication se trouve dans le site web suivant.
http://www.allinworld99.blogspot.com/2015/04/triggers-in-sql.html
J'ai enfin trouvé une solution universelle, qui ne nécessite pas de sql dynamique et enregistre les changements de toutes les colonnes.
Ce n'est pas nécessaire de modifier le déclencheur si les changements de table.
C'est le journal d'audit:
C'est l'élément déclencheur d'une table:
Ce déclencheur est pour une Table nommée AGB. La Table avec le nom de l'AGB a une Colonne de Clé primaire avec le nom ID et une Colonne avec le Nom LastModifiedBy qui contient le nom d'utilisateur qui a fait la dernière édition.
Le déclencheur se compose de deux parties, d'abord, il convertit les colonnes de tables inserted et deleted en lignes. Ceci est expliqué en détail ici: https://stackoverflow.com/a/43799776/4160788
Puis il rejoint les lignes (une ligne par colonne) de la tables inserted et deleted par de clé primaire et de nom de champ, et les journaux une ligne pour chaque changé colonne. Il n'enregistre PAS les changements d'identité, ou d'Horodatage LastModifiedByColumn.
Vous pouvez insérer votre propre nom de la table, noms de Colonnes.
Vous pouvez également créer la procédure stockée suivante, et ensuite appeler cette procédure stockée pour générer vos déclencheurs:
Chaque table on veut surveiller, aura besoin de son propre déclencheur. Il est assez évident, que - comme l'a souligné dans l'acceptation de réponse - la génération de code sera une bonne chose.
Si vous aimez cette approche, il pourrait être une idée pour utiliser ce déclencheur et de remplacer certaines étapes générales avec code généré pour chaque table séparément.
Néanmoins, j'ai créé un entièrement générique Vérification de Déclenchement. L'observé table doit avoir un PK, mais ce PK peut-être même multi-colonne.
Certains types de colonnes (comme des Gouttes) peut ne pas fonctionner, mais vous pouvez facilement les exclure.
Ce ne sera pas le meilleur dans la performance 😀
Pour être honnête: C'est plus le genre d'exercice...
--Une table pour tester cette (utilisé bizarre PK colonnes sur le but...)
--Quelques données de test
--C'est le contenu actuel
--Le trigger pour la vérification
--Maintenant, nous allons le tester avec certaines opérations:
--Vérifier le statut final
--Nettoyer (attention avec des données réelles!)
Le résultat de l'insertion
La sélective suite à une mise à jour
Et le résultat de supprimer
Il y a un générique façon de le faire.