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

MS SQL Server Discussion :

trigger d'audit d'une table


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 270
    Par défaut trigger d'audit d'une table
    Bonjour à tous!
    Je travail actuellement sur base de données sur laquelle je souhaiterais réaliser des audit en cas d'effacement d'une occurence d'un table.
    Pour cela j'ai fait un trigger que voici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ON [dbo].[PANIER]
    FOR DELETE
    AS 
    DECLARE @nomPanier nvarchar(50), @userId nvarchar(50);
    select @userId = user_ID from PANIER ;
    select @nomPanier = PANIER_NOM from PANIER;
    BEGIN     
     insert into AUDIT_PANIER (PANIER_NOM,user_ID,DATE_MODIF)  values(@nomPanier,@userID,GETDATE()) 
    END
    Le but de la manoeuvre c'est d'enregistrer l'occurence supprimé dans une table faite pour cela à savoir que la table PANIER que je veux audité à la même structure que la table AUDIT_PANIER à raison d'une collone DATE_MODIF qui me permet de savoir quand il y a eu un effacement.
    Si je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DELETE  from  PANIER where user_ID='alex'
    Je retrouve bien un enregistrement dans la table AUDIT_PANIER qui correspond à la date d'effacement de ma donnée mais les champs PANIER_NOM et user_ID ne correspondent pas à la ligne effacé .
    Pourriez vous me filer un petit coup de main?
    Merci d'avance

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Votre trigger ne fonctionne pas comme vous le souhaitez parce que vous avez écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT @userId = user_ID FROM PANIER ;
    SELECT @nomPanier = PANIER_NOM FROM PANIER;
    Ceci affecte un user_ID et un PANIER_NOM aux variables, mais vous ne saurez jamais lequel, car cela dépend des index qui sont sur votre table.

    Ensuite votre trigger est faut parce qu'il n'utilise pas les tables virtuelles INSERTED et DELETED.
    Ce sont deux tables virtuelles, qui, dans un trigger sur :

    - UPDATE, vous donne accès aux tables virtuelles INSERTED et DELETED, qui reflètent respectivement les nouvelles et anciennes valeurs prises par les lignes affectées par l'UPDATE;

    - INSERT, vous donne accès à la table virtuelle INSERTED, qui reflète seulement les nouvelles lignes ajoutées à la table;

    - DELETE, vous donne accès à la table virtuelle DELETED, qui reflète seulement les lignes supprimées de la table.

    Enfin il est encore faux parce que vous considérez que vous ne faites une suppression que d'une seule ligne.
    Or si je passe derrière vous et que j'exécute DELETE FROM dbo.PANIER, je viens de vider la table.
    Votre trigger ne "tracera" toujours pas les lignes que je viens de supprimer, et ajoutera des lignes aux valeurs hasardeuses dans la table d'audit.

    Vous pouvez également simplifier votre code en mettant une contrainte de valuation par défaut à la colonne DATE_MODIF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE dbo.AUDIT_PANIER
    ADD CONSTRAINT DF_AUDIT_PANIER__DATE_MODIF DEFAULT (GETDATE()) FOR DATE_MODIF
    Cela vous évite de devoir le spécifier dans le trigger
    Attention une telle contrainte ne fonctionne que sur INSERT, par sur UPDATE.

    Finalement, votre trigger serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TRIGGER monTrigger 
    	ON dbo.PANIER
    FOR DELETE
    AS
    BEGIN	
    	INSERT INTO dbo.AUDIT_PANIER
    	(
    		colonnesDeAUDIT_PANIER_sansLaColonneDATE_MODIF
    	)
    	SELECT	colonnesDePANIER
    	FROM		DELETED	
    END
    @++

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 270
    Par défaut
    Ouaw! Et bien franchement merci de m'avoir répondu aussi rapidement et surtout pour la qualité et la pertinance des informations fournises qui reflète votre professionalisme.
    Encore merci!

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Avec plaisir

    @++

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/10/2011, 14h24
  2. Réponses: 5
    Dernier message: 23/06/2011, 15h31
  3. [SQL 2008R2] Trigger de suppression sur une table récursive
    Par sebRD dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 11/05/2011, 14h44
  4. audit sur une table
    Par amarkamel dans le forum Administration
    Réponses: 5
    Dernier message: 30/06/2010, 00h37
  5. trigger au niveau d'une table
    Par zinabd dans le forum PL/SQL
    Réponses: 1
    Dernier message: 04/02/2009, 15h51

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