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 :

[TRIGGER] Informations doublées


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut [TRIGGER] Informations doublées
    Bonjour à vous,

    J'ai créé un Trigger comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    USE [BIJOU] 
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TRIGGER TG_UPD_CThisto ON [dbo].[F_COMPTET]
    AFTER UPDATE
    AS
    BEGIN
        -- pour ne pas retourner à l'application le
        -- nombre de lignes affectées
        SET NOCOUNT ON
     
        -- Traitement
        INSERT INTO dbo.HISTO_TIERS
        (
            CT_Num,
            CT_Intitule,
            CT_Type,
            CT_Adresse,
            CT_Complement,
            CT_CodePostal,
            CT_Ville
        )
        SELECT CT_Num,
            CT_Intitule,
            CT_Type,
            CT_Adresse,
            CT_Complement,
            CT_CodePostal,
            CT_Ville
        FROM DELETED
    END
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    Lorsque je fais une mise à jour d'une valeur sur la table [dbo].[F_COMPTET], j'ai bien un insert qui se réalise dans ma table dbo.HISTO_TIERS.
    Mais le problème est que ca me réalise 2 inserts : 1 ligne avec l'ancienne valeur et une ligne avec la nouvelle valeur.

    Avez vous une idée du problème ?

    Fabrice

  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
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Non, car votre trigger est bon !

    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 du Club
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    Pensez vous que cela provienne du fait que sur la table [dbo].[F_COMPTET], il existe d'autres Trigger de type update, delete et insert ?

    Fabrice

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par n0uki Voir le message
    Pensez vous que cela provienne du fait que sur la table [dbo].[F_COMPTET], il existe d'autres Trigger de type update, delete et insert ?
    Si ça vient pas de votre nouveau trigger, ça vient d'ailleurs !
    Vous n'avez pas vérifié le code des autres triggers ?

  5. #5
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    Mon niveau débutant ne me permet pas de comprendre ce qui se passe dans tous les autres Trigger

    Je vais essayer d'historiser des informations à partir d'une autre table pour voir comment cela se passe.

    J'ai effectué une tentative de Trigger pour faire de l'historisation sur une autre table et même résultat... Ca me double l'insertion avec l'ancienne et la nouvelle valeur.

    Cela n'a pas vraiment de bon sens.

    Si je fais un INSTEAD OF UPDATE en lieu et place du AFTER UPDATE, il m'enregistre bien dans ma table d'histo la bonne modification, mais il ne mets pas à jour ma table de référence.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par n0uki Voir le message
    Mon niveau débutant ne me permet pas de comprendre ce qui se passe dans tous les autres Trigger
    Vous avez tout de même les moyens de voir si le nom de votre table est présent dans le code et s'il y un insert dessus, non ?

  7. #7
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    La table qui historise, est une table que j'ai créé par mes soins.

    Les Triggers existant dans la table source ne peuvent donc pas contenir des actions qui joueraient sur ma table que j'ai créé.

    Seul le Trigger que j'ai créé pour l'histo des modif tapent dans la table que j'ai créé.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Si vous le supprimez, est-ce que le problème est toujours présent ?
    Vous n'auriez pas créé le même trigger sous différents noms ?

  9. #9
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    Re,

    j'ai supprimé le trigger que j'ai créé... Du coup, quand je réalise une modification, je n'ai plus rien qui s'inscrit dans la table d'histo que j'ai créé.

    Cela parait normal et je n'ai donc pas créé 2 fois le même trigger sous 2 noms différents.

  10. #10
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    J'ai trouvé ma réponse...

    En fait, je modifie qu'un seul sur ma table de référence que je veux historiser.

    Mais le système modifie en automatique un autre champs de ligne modifiée.

    Du coup, le trigger s'execute plus ou moins 2 fois si j'ai bien compris.

    Si je rajoute un IF UPDATE(unchamps) entre le AS et le BEGIN alors ca m'historise bien seulement l'ancienne information.

    Il faut désormais que je m'attaque à l'historisation de la date et d'enregistrer l'utilisateur qui a modifié la valeur.

  11. #11
    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 : 44
    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,

    Du coup, le trigger s'execute plus ou moins 2 fois si j'ai bien compris.
    Le trigger est exécuté autant de fois que l'événement pour lequel il est spécifié qu'il doit s'exécuter.
    Si vous exécutez 10000 INSERT d'un tuple sur une table avec un trigger sur INSERT, celui-ci sera exécuté 10000 fois.
    Si vous faites un INSERT de 10000 tuples sur cette même table, le trigger ne sera exécuté qu'une seule fois.

    @++

  12. #12
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    Merci de vos réponses,

    Mais j'ai un peu de mal avec le mot "tuple"... même si google est mon ami !

    Si je te comprends elsuket, dans mon cas, SQL doit faire XXX insert/update d'un tuple sur ma table... Ce qui fait que mon trigger s'exécute plusieurs fois.

    Si je traduis différemment... Ca peut vouloir dire cela ?

    Imaginons une table avec les champs : ID, Ref, PrixVen, cbModification

    La modification PrixVen est modifiée et également cbModification. Mais ce n'est pas le même traitement qui modifie les deux informations en même temps (ce qui est stupide en soit surement).

    Vu que c'est un programme propriétaire, je ne peux pas échapper à ce mode d'enregistrement j'imagine.

    Donc je n'ai pas le choix, je dois faire un IF UPDATE précis pour obtenir l'exécution du Trigger une seule fois. C'est bien ca ?

Discussions similaires

  1. e17 : demande d'informations + double écran
    Par troumad dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 19/12/2008, 15h53
  2. Attributs (Informations) double
    Par Oberown dans le forum PowerAMC
    Réponses: 2
    Dernier message: 10/09/2008, 13h47
  3. Double insertion trigger
    Par Yanmeunier dans le forum Développement
    Réponses: 1
    Dernier message: 19/12/2005, 15h03
  4. Réponses: 2
    Dernier message: 08/12/2005, 14h12
  5. Trigger vidant des informations selon une contrainte de temp
    Par jlassira dans le forum Développement
    Réponses: 1
    Dernier message: 16/11/2005, 15h50

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