Journal des modifications à la table de base de données avec déclencheur
Je suis à la recherche d'une bonne manière d'enregistrer les changements qui se produisent sur un ensemble particulier de tables dans ma base de données SQL Server 2005. Je crois que la meilleure façon de le faire est par le biais d'un déclencheur qui est exécuté sur les mises à jour et des suppressions. Est-il de toute façon à saisir la déclaration proprement dite qui est en train d'être exécuté? Une fois que j'ai la déclaration que je peut facilement se connecter quelque part d'autre (d'autres de la table DB). Cependant, je n'ai pas trouvé un moyen simple (si possible) pour saisir l'instruction SQL qui est en train d'être couru.
Il serait si facile de le faire à partir de l'application de prise de la base de données d'appel. Vous auriez le texte SQL et/ou le nom de la procédure stockée + les noms de paramètres et de valeurs. Mais vous auriez à être le développeur de l'application, et non pas l'administrateur de la base, pour avoir un contrôle là-dessus.
Et aussi, vous ne vous connectez pas quelque chose qui a effectué les mises à jour ou supprime par d'autres connexions.
Et aussi, vous ne vous connectez pas quelque chose qui a effectué les mises à jour ou supprime par d'autres connexions.
OriginalL'auteur Jason | 2009-05-22
Vous devez vous connecter pour publier un commentaire.
Déclencheurs sont mauvais, je resterais loin de déclencheurs.
Si vous essayez de résoudre quelque chose, joindre Le Générateur De Profils Sql à la base de données avec des conditions spécifiques. Il enregistre chaque exécution de la requête pour votre inspection.
Une autre option est de changer de programme appelant à se connecter à ses requêtes. C'est une pratique très courante.
Côté intensification de votre question, mais essayez d'améliorer votre relation avec les administrateurs de base de données? Vous pouvez le démontrer sur un serveur de test qui Profileur n'ont pas un grand impact. Inviter l'administrateur de la base à une discussion avec les entreprises intéressées, qui leur donne une idée c'est grave, et à la fin de la journée, l'entreprise paie l'administrateur de la base de salaire.
Finalement convaincu les administrateurs de base de données pour activer le générateur de profils SQL. Toutefois, il n'est activée pendant une semaine.
Pourquoi sont des déclencheurs mauvais?
Les déclencheurs d'ajouter de la complexité qui est difficile à voir; vous ne vous attendez pas un déclencheur d'exception lorsque vous mettez à jour/insérer un tableau. Les déclencheurs sont difficiles à déboguer: le changement peut briser totalement sans rapport avec morceau de logiciel, souvent de façon inattendue. Les déclencheurs sont difficiles à écrire, en particulier pour la haute charge des systèmes de sécurité. Et je vais juste citer les déclencheurs qui déclenchent d'autres déclencheurs et vous permettent de déterminer si c'est une bonne idée 🙂
OriginalL'auteur Andomar
Si vous voulez juste pour garder un journal de toutes les transactions (insert, update et delete) dans certains tables de base de données, vous pouvez exécuter le script suivant:
Ce n'est pas remplir la oldvalue/newvalue champs. Mieux, réponse complète ici stackoverflow.com/questions/19737723/...
OriginalL'auteur Juan Carlos Velez
Vous devriez être en mesure d'accomplir cette tâche en utilisant la système de gestion de vues.
Un exemple serait quelque chose comme ceci:
Je ne suis pas sûr que ce sera aussi utile à vous comme un plus centrée sur les données, le mécanisme de journalisation peut-être, cependant.
C'est cool, je n'avais pas réalisé, ils étaient disponibles. Cependant, ils ne montrent pas la déclaration que fait la mise à jour - on dirait qu'ils montrent l'ensemble du lot. Toujours très utile et peut-être les exigences d'ajustement.
Malheureusement, nous n'avons pas une procédure stockée qui est couru pour mettre à jour les tables. C'est un vieux système qui est d'avoir des problèmes, et on essaye de diagnostiquer qui est en cours d'exécution des mises à jour/supprime et que les déclarations qu'ils sont en cours d'exécution.
Oui, vous pouvez mettre ce code dans le déclencheur pour les tableaux en question et de consigner les résultats à une autre table pour une analyse ultérieure. Qui va attraper les mises à jour à partir de n'importe où.
OriginalL'auteur mwigdahl
N'oubliez pas que votre enregistrement va être de la partie à la transaction, donc si il y a une erreur et vous rollback de la transaction, votre journal sera également supprimé.
Yepp, j'ai été ce personnage 🙂
OriginalL'auteur idstam
MSSQL a des tables virtuelles nommé "Inséré" et "Supprimer", qui contiennent nouvellement inséré et/ou récemment supprimés et/ou nouvellement mise à jour d'enregistrements de données, à laquelle vous pouvez accéder à partir d'un déclencheur ... je utiliser ces, de savoir quelles données a changé (c'est plutôt qu'on me dise ce que l'énoncé modifié les données).
OriginalL'auteur ChrisW
Il existe un modèle pour la création de ces de ces éléments déclencheurs appelé Journal de Déclenchement. C'est vendeur indépendant et très simple. Il est décrit dans ici.
Les modifications sont enregistrées sur un autre histoire table. Il n'y a aucun moyen de saisir l'énoncé exact, mais il est possible de détecter si c'est l'insertion, et de mettre à jour ou une suppression, car il crée un "enchaîné" du jeu d'enregistrements. L'insertion est un record avec pas de prédécesseur, une suppression d'un enregistrement avec pas de successeur, intermédiaire enregistrements sont mises à jour. Les changements peuvent être détectés en comparant un enregistrement à l'encontre de son prédécesseur.
Il est très facile d'obtenir une instantané d'une seule entité (ou de l'ensemble de la table) à un point donné du temps.
En bonus, la syntaxe de ce modèle pour SQL Server se trouve être la plus simple, par rapport à Oracle, DB2 et MySQL.
OriginalL'auteur user1309314
avez-vous vraiment besoin de vous connecter à la déclaration qui a couru, la plupart des gens, le journal a changé de données (tables INSERTED et DELETED au sein du déclencheur).
OriginalL'auteur KM.
Déclencheurs sont un bon moyen de s'assurer que toutes les modifications sont enregistrées, depuis ils seront presque toujours le feu indépendamment de la façon dont les mises à jour sont effectuées - par exemple ad-hoc, les connexions ainsi que des connexions d'application.
Comme suggéré par @mwigdahl, le système de gestion de points de vue apparaissent comme un bon moyen de capter le courant par lot. Si c'est particulièrement utile pour ouvrir une session à la détente, c'est autre chose.
Un inconvénient à l'utilisation de déclencheurs, c'est que vous ne pouvez identifier la source de la mise à jour de la base de données de connexion. De nombreuses applications n'ont pas toutes les informations de l'utilisateur associé à la connexion, pour faciliter le regroupement de connexion, de sorte que vous ne connaissez pas l'utilisateur qui effectue l'action. c'est à dire la Connexion utilisée par la connexion est une application générique de connexion plutôt que de la personne qui utilise l'application. La voie normale pour contourner ce problème consiste à utiliser des procédures stockées en tant qu'interface pour tous interaction de base de données, puis de s'assurer qu'un utilisateur est transmis à tous les appels de procédure. Vous pouvez ensuite effectuer votre enregistrement via la procédure stockée à la place d'un déclencheur. Clairement, ce n'est utile que si vous connaissez des gens de ne pas mettre à jour les tables directement, sans l'aide de la procédure, ou n'avez pas besoin de vous connecter à cette situation.
La capacité à obtenir en cours d'exécution du lot pourrait fournir un meilleur mécanisme: si vous assurer que tous vos sql lots contiennent un nom d'utilisateur, vous pouvez l'extraire à partir du sql à l'intérieur de votre détente. Qui vous permettra de faire tous les journaux avec des déclencheurs, ce qui signifie que vous capturez tout, mais aussi vous permettent d'associer des modifications à un utilisateur particulier.
Si vous allez vers le bas sur la gâchette itinéraire, il est conseillé de vérifier les situations les déclencheurs ne sont pas tirés (peut-être en vrac chargement de données? ou si les gens ont l'autorisation de désactiver les déclencheurs).
Également considérer comme @idstam souligné que le code du déclencheur sera à l'intérieur de votre transaction sera normalement connecté et restaurée avec elle.
Une autre chose à considérer lors de la rédaction des déclencheurs est le comportement de @@IDENTITY: si vous avez des procédures à l'aide de @@IDENTITY vous pourriez accidentellement modifier leur comportement.
OriginalL'auteur Rory
Utiliser un Journal De Déclenchement
Il y a peu de raison de capturer le réel SQL car il y a beaucoup de différents états qui changent les données de la même manière.
OriginalL'auteur grokster
Essayez d'installer certains déclencher basé outil tiers comme ApexSQL Audit et puis d'ingénierie inverse de la façon dont ils le font. Il suffit de l'installer en mode d'essai et de voir comment il génère des déclencheurs pour la capture de toutes les différentes sortes d'informations.
Plusieurs autres choses à prendre en compte sont:
La planification du stockage – si vous avez beaucoup de mises à jour, cela signifie que vous aurez une tonne de données d'audit. J'avais envisager de stocker les données dans des bases de données distinctes. Surtout si vous prévoyez sur l'audit de plus d'une base de données.
La gestion de la quantité de données au fil du temps, vous ne sera probablement pas dans un besoin de garder certains très anciens enregistrements. Plan sur la suppression simple des anciennes données
Les modifications de schéma – ce que si le schéma est mis à jour. Dans le pire des cas, ce qui déclenche votre volonté d'arrêter de travailler, et de lever une erreur si pas correctement créé. Dans le meilleur des cas, il vous manque certaines données. C'est aussi quelque chose à considérer.
En prenant tout cela en compte, il est probablement le plus efficace du temps pour aller avec certains déjà développé une solution vs la création de ce à partir de zéro vous-même.
OriginalL'auteur Joel Cuff
Être prudent, car les déclencheurs d'incendie au niveau de la LIGNE, pas de l'INSTRUCTION SQL. Donc, si quelqu'un ne "SUPPRIMER DE BIGTABLE", votre trigger se déclenche pour chaque ligne de la table (cela concerne en particulier en ce qui concerne le fait que vous voulez savoir, l'instruction SQL qui a réalisé l'opération, de sorte que vous aurez besoin de "comprendre" pour chaque ligne de la déclaration de la touche).
OriginalL'auteur Will Hartung