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 INSERT sur lot d'enregistrements


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 6
    Par défaut Trigger INSERT sur lot d'enregistrements
    Bonsoir,

    J'ai 2 tables : FACTURE (Tempo_1 dans le script) et ENCHERES
    Un trigger sur INSERT positionné sur la table FACTURE qui doit mettre à jour un champ MONTANT MAJORE dans certains enregistrements de la table ENCHERE en fonction de jointures et variables définis dans mon trigger.

    Si j'insère un seul enregistrement dans la table FACTURE tout se passe bien.
    Par contre si j'insère un lot d'enregistrements, un seul enregistrement est correctement mis à jour dans ma table ENCHERES.

    Dois-je utiliser la table INSERTED, vu que les curseurs sont impossible dans un trigger, pour faire en sorte que tous mes enregistrements insérés dans FACTURE déclenchent la mise à jour correspondante dans ENCHERES ?

    FOR EACH ROW ?

    Merci d'avance pour vos lumières ....

    Voici le script :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
     
    ALTER Trigger [dbo].[Calcul_montants_majores] 
    On [dbo].[Tempo_1]
    FOR INSERT
    As
    /* Date dernière Révision: 14/10/2007*/
     
    --Déclaration des variables
    DECLARE
    @refpiece nvarchar (50),
    @numb int,
    @prixdepart money,
    @montant_avcom money,
    @reflot nvarchar(15),
    @idoffre int
    --Déclaration de la Transaction
    DECLARE @TranName VARCHAR(20)
    SELECT @TranName ='Test'
     
    --Début de la Transaction
    BEGIN TRANSACTION  @TranName
     
    --Stockage de la reference extrait de la table INSERTED
    SELECT 
    @refpiece= ref_piece
    --En partant de la table Tempo_1 à laquelle je donne l'alias (T)
    -- je joins la table INSERTED en établissant une relation d'ID.
    FROM dbo.Tempo_1 T INNER JOIN inserted i ON T.id_enchere = i.id_enchere INNER JOIN  base_repartition.dbo.ENCHERES_History e2 ON  (e2.id_enchere= i.id_enchere)
    INNER JOIN base_repartition.dbo.PIECES_History P1 ON (P1.id_piece=e2.id_piece)
     
     
    --Compter le nombre d'ordres
    SELECT
    @numb=count(id_enchere) FROM (SELECT TOP 2
    ref_piece,  e2.montant_enchere,id_enchere
    FROM base_repartition.dbo.ENCHERES_History e2
    INNER JOIN base_repartition.dbo.PIECES_History P1
    ON (P1.id_piece=e2.id_piece)
    WHERE ref_piece=@refpiece
    GROUP BY ref_piece,e2.montant_enchere,id_enchere
    ORDER BY e2.montant_enchere DESC) RESULT
     
    --Si un seul ordre pour la référence
    IF @numb=1
    BEGIN
    --Recuperer le prix de départ du lot
    SELECT TOP 1
    @prixdepart=P1.startprice_piece,
    @reflot=ref_piece,
    @idoffre=e2.id_enchere
    FROM base_repartition.dbo.ENCHERES_History e2
    INNER JOIN base_repartition.dbo.PIECES_History P1
    ON (P1.id_piece=e2.id_piece)
    WHERE ref_piece=@refpiece
    GROUP BY ref_piece,e2.montant_enchere, e2.id_enchere, P1.startprice_piece
    ORDER BY e2.montant_enchere DESC
     
    --Mettre à jour la colonne montant_majore avec le prix de départ
    -- Execute the INSERT statement.
    UPDATE  base_repartition.dbo.ENCHERES_History
    SET
    montant_majore=@prixdepart
    FROM base_repartition.dbo.ENCHERES_History
    WHERE  base_repartition.dbo.ENCHERES_History.id_enchere=@idoffre
    END
     
    ELSE
    BEGIN
    --Si au moins deux ordres pour une référence
    SELECT TOP 1
    --Recuperer le montant de l'ordre tout de suite après enchère gagnante
    @montant_avcom=e2.montant_enchere,
    @reflot=ref_piece,
    @idoffre=e2.id_enchere
    FROM base_repartition.dbo.ENCHERES_History e2
    INNER JOIN base_repartition.dbo.PIECES_History P1
    ON (P1.id_piece=e2.id_piece)
    Left join Tempo_1 T1
    ON (T1.id_enchere=e2.id_enchere) 
    WHERE ref_piece=@refpiece AND T1. id_enchere IS NULL
    GROUP BY ref_piece,e2.montant_enchere, e2.id_enchere
    ORDER BY e2.montant_enchere DESC
     
    --Mettre à jour la colonne montant_majore avec la deuxième meilleur offre plus la commission
    -- Execute the INSERT statement.
    UPDATE  base_repartition.dbo.ENCHERES_History
    SET
    montant_majore=@montant_avcom+2
    FROM base_repartition.dbo.ENCHERES_History INNER join Tempo_1 T1 ON (T1.id_enchere=base_repartition.dbo.ENCHERES_History.id_enchere) INNER JOIN base_repartition.dbo.PIECES_History P1
    ON (P1.id_piece=base_repartition.dbo.ENCHERES_History.id_piece)
    WHERE  P1.ref_piece=@reflot AND  base_repartition.dbo.ENCHERES_History.id_enchere=T1.id_enchere
    END
    BEGIN
    COMMIT TRANSACTION Test
    END

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Par défaut
    bonjour,

    il faut tester la variable @@rowcount qui renvoie le nombre de lignes insérées au tout début du trigger pour agir en conséquence et effectivement utiliser le contenu de la table inserted qui contient la ou les lignes insérées.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 6
    Par défaut @@rowcount et while
    Merci pour cette piste ...

    Cela soulève cependant une autre interrogation. Est-il envisageable d'utiliser quelque chose comme :

    en début de trigger en sachant que BEGIN TRANSACTION ou COMMIT TRANSACTION réinitialisent la valeur ROWCOUNT à 0 ?

    Si je fais une telle boucle @@rowcount va-t-il se décrémenter à chaque passage dans ma boucle ?

    Merci encore pour vos suggestions toujours pertinentes ...

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Par défaut
    bonjour,

    pour la boucle, je me pencherais plutôt à une simplification du trigger pour
    faire de la màj en masse dans ENCHERE (facile à dire j'imagine)

    à priori le while irait (à condition de mettre le @@rowcount dans une variable intermédiaire) mais il y a de gros risues d'effets vraiment néfastes sur les perfs... avec des inserts qui durent des plombes et qui verrouillent allégrement.

Discussions similaires

  1. trigger qui realise une insertion sur une autre base
    Par kamy86 dans le forum Débuter
    Réponses: 1
    Dernier message: 21/07/2009, 16h29
  2. trigger "update sur insert" avec insertion multiple
    Par harf18 dans le forum Développement
    Réponses: 4
    Dernier message: 18/05/2009, 15h46
  3. Trigger d'insertion sur une vue
    Par Cirtadz dans le forum PL/SQL
    Réponses: 40
    Dernier message: 19/02/2009, 13h56
  4. Trigger Insert after sur une même table
    Par soumimasen dans le forum PL/SQL
    Réponses: 3
    Dernier message: 29/05/2008, 19h49
  5. Triggers d'insertion sur database externe
    Par Shiva dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 23/11/2007, 20h10

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