IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

[SQL2005] TRIGGER permettant de tracer les modifications


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 6
    Par défaut [SQL2005] TRIGGER permettant de tracer les modifications
    Bonjour

    Je souhaiterai tracer les modifications effectuées sur chaque champ des tables de ma base de données (sous SQL Server).

    Pour cela, j'ai créé une table Historique comprenant les champs :
    - idColonne (lien vers la table colonne)
    - dateModif
    - auteur
    - avant (la valeur du champ avant la modification)
    - apres (la valeur du champ apresla modification)

    Je souhaiterai créer un TRIGGER qui se déclencherai à chaque insert/update/delete et qui insérerai une ligne dans la table Historique.

    Voici les questions que je me pose :
    - comment récupérer le nom du champ modifié (pour remplir le champ historique.idColonne) ?
    - comment créer un trigger pour toutes les tables (est-ce possible ?)

    Merci de votre aide (soyez indulgents je suis débutante )

    Kitty

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 994
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Voici les questions que je me pose :
    - comment récupérer le nom du champ modifié (pour remplir le champ historique.idColonne) ?
    La vue d'information de schema INFORMATION_SCHEMA.COLUMNS contient les définitions des colonnes de toutes les tables de votre base. Croisez là avec les pseudo tables inserted et deleted.


    - comment créer un trigger pour toutes les tables (est-ce possible ?)
    Pas directement. En revanche une fois le code générique de votre trigger écrit, vous pouvez générer tous les triggers pour toutes les tables à l'aide d'une procédure stockée.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Bonjour,

    En vrac :

    quelques liens vers des solutions (en anglais) :
    http://www.devx.com/gethelpon/10MinuteSolution/16544
    http://www.nigelrivett.net/AuditTrailTrigger.html

    Pour info, attention aux comparaisons COLUMNS_UPDATED() et ORDINAL_POSITION la vue INFORMATION_SCHEMA.COLUMNS que tu peux trouver dans ces exemples.

    Selon l'aide en ligne SQL 2005 :

    Dans SQL Server 2005, la colonne ORDINAL_POSITION de la vue INFORMATION_SCHEMA.COLUMNS n'est pas compatible avec le modèle binaire des colonnes retournées par COLUMNS_UPDATED. Pour obtenir un modèle binaire compatible avec COLUMNS_UPDATED, référencez la propriété ColumnID de la fonction système COLUMNPROPERTY lorsque vous interrogez la vue INFORMATION_SCHEMA.COLUMNS
    Il y a un exemple dans l'aide en ligne, sous COLUMNS_UPDATED()

    Une autre idée dans ton trigger pour tester les lignes qui ont vraiment été changées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	SELECT *
    	FROM (SELECT CHECKSUM(*) as chksum, * FROM inserted) i
    	JOIN (SELECT CHECKSUM(*) as chksum, * FROM deleted) d ON i.id = d.id
    	WHERE i.chksum <> d.chksum

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 6
    Par défaut
    C'est bon ça marche !! J'ai utilisé les liens que vous m'avez indiqué

    Merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tracer les modification dans une table Oracle
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 3
    Dernier message: 21/09/2010, 11h48
  2. Tracer les modifications avec linq
    Par soad dans le forum Linq
    Réponses: 1
    Dernier message: 30/08/2010, 16h35
  3. [sql2005]trigger qui s'éxecte sur toutes les lignes
    Par malikoo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 31/07/2006, 12h33
  4. Tracer les modifications d'une table
    Par vinze11 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/02/2006, 13h44
  5. Logiciel permettant de connaitre les fichiers utilisés
    Par Mut dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 14/02/2004, 17h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo