2009-01-08 9 views
0

J'ai un problème avec une base de données à mon travail. Il y a actuellement un audit en place, mais il est difficile de le maintenir, et il manque de quelques points. Donc je le remplace. Je veux faire ceci de manière aussi générique que possible et avoir conçu les tables, et comment tout sera lié et mis à jour. Maintenant, tout va bien et bien, mais je veux être en mesure d'écrire une façon générique d'insérer des enregistrements dans ces tables d'audit. (Sans avoir à entrer une commande pour chaque colonne de chaque table en cours de modification.)MS SQL Audit

Existe-t-il une procédure stockée pour parcourir toutes les colonnes d'une table? Et je voudrais écrire cela de telle manière qu'il fonctionne avec plusieurs tables, et ramasse et vérifie automatiquement les colonnes ajoutées et autres.

Des idées?

EDIT: Je suppose que je devrais clarifier. Je vais vérifier les données contenues dans les tableaux. Mais je vais utiliser la même table (s) pour stocker les données vérifiées pour chaque table dans la base de données.

Et je ne peux pas utiliser les déclencheurs car généralement, lorsqu'une mise à jour se produit, elle se produit sur plusieurs tables, mais j'aimerais que toutes ces mises à jour fassent partie d'un seul ensemble de modifications.

Ce n'est pas un problème, car je peux faire toutes les mises à jour à partir d'un seul processus stocké. Je préfèrerais juste un peu comme une boucle, que je puisse obtenir tous les champs mis à jour, déterminer ceux qui ont changé, et insérer ceux qui ont été modifiés dans la table d'audit.

Et je voudrais le faire sans avoir une longue liste d'instructions if et insérer des instructions pour chaque colonne. (En faisant cela dans une boucle générique, il gérera les colonnes ajoutées automatiquement et ne sera pas dérangé par les colonnes supprimées)

Répondre

0

Il y aurait des considérations de performance, mais vous pouvez ajouter des déclencheurs d'insertion et de mise à jour à toutes vos tables, et avoir le déclenche l'insertion dans vos tables d'audit.

+0

Je préférerais ne pas avoir à le faire de cette façon parce que je devrais connaître chaque colonne à l'avance. Et je voudrais que ce système prenne automatiquement de nouvelles colonnes et ignore les colonnes supprimées sans aucune intervention. Je voudrais faire tout à partir de procs stockés. – TJMonk15

+0

Je peux comprendre vouloir tout faire via procs, mais en utilisant COLUMNS_UPDATED() vous devriez être capable de déterminer quelles colonnes ont été mises à jour sans que vous sachiez quelles colonnes sont dans la table. – cmsjr

1

Par "colonnes ajoutées" je suppose que vous cherchez à auditer DDL. Si vous utilisez SQL 2005, vous voulez this link. Si vous n'utilisez pas SQL 2005, vous pouvez utiliser l'un des nombreux outils de comparaison de schéma SQL, comme le jeu d'outils SQL Red Gates.

Si vous n'avez pas $ pour les outils, vous pouvez simplement exécuter des requêtes périodiques sur information_schema.tables et information_schema.columns. En capturant périodiquement ces dans les tableaux bas hors, vous pouvez identifier quand ils ont gagné ou les lignes perdues (et donc un schéma changé survenu)

Si vous effectuez la vérification de données au lieu, alors vous voudrez voulez coder générer des triggers, en utilisant à nouveau information_schema.tables et information_schema.columns.

0

Cela pourrait être fait si vous utilisiez une couche d'accès aux données qui pourraient piéger les tables et colonnes sont en cours mise à jour et générer les instructions d'insertion de la table de vérification. Dans une procédure stockée? Quelle procédure stockée? Avez-vous un seul qui fait des mises à jour? Ou en créez-vous un par table?

+0

Il s'agira d'une procédure stockée par "ensemble" de mises à jour. Et je préférerais faire cela du côté des données car plusieurs applications accèdent à ces données. – TJMonk15

0

Si c'est une option pour vous, effectuez une mise à niveau vers sql server 2008 et activez Change Data Capture.