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 avec inserted + UPDATE sur INSERTED


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 23
    Points : 20
    Points
    20
    Par défaut TRIGGER avec inserted + UPDATE sur INSERTED
    Comme écrit dans le titre est-il possible de mettre a jour INSERTED avant d'écrire donnée dans une table quelconque? On essaye a 2 de créer un TRIGGER , qui a la création d'un nouvel article, se voit faire un UPDATE sur un champ dans INSERTED ou dans sa table final. Mais on n'y arrive pas, n'étant pas des experts en TRIGGER. Quelqu'un connaitrait-il les TRIGGER assez bien pour nous aider. Merci d'avance.

  2. #2
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Vous ne pouvez updater la table Inserted car c'est une peusodo-table.

    Poster votre scripte, le forum est là pour ca.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    pour plus d'info voici le TRIGGER:


    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
     
    CREATE TRIGGER TG_INS_LOT ON [dbo].[F_LOTSERIE] 
    FOR INSERT 
    as
          declare @lot as char(25)
          declare @ar_ref as char(20)
          declare @dlnoin as char(20)
     
          select @ar_ref=ar_ref from inserted
          select @lot=max(ls_noserie)+1 from f_lotserie where ar_ref=@ar_ref
          select @dlnoin = dl_noin FROM inserted 
    begin
     
          UPDATE F_lotserie SET ls_noserie =  @lot FROM inserted WHERE F_LOTSERIE.cbMarq = inserted.cbMarq
     
    END

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Votre trigger est complement faux parce que le trigger n'exécute son code qu'une seule fois même si l'ordre SQL qui l'a déclenché à porté sur des milliers de lignes.

    Par conséquent toute utilisation de variable dans un trigger est suspect.
    Il faut faire du code ensembliste (des requêtes SQL) ou bien utiliser un curseur pour parcourir les lignes des tables deleted/inserted...

    En l'occurrence votre trigger devrait s'écrire à peu près comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TRIGGER TG_INS_LOT ON dbo.F_LOTSERIE
    FOR INSERT
    AS
     
          UPDATE F_lotserie 
          SET    ls_noserie =  max(ls_noserie)+1 
          FROM   inserted i
                 INNER JOIN f_lotserie l
                       ON i.ar_ref = l.ar_ref
          WHERE  cbMarq = i.cbMarq
    Le seul "hic" c'est que si vous insérez plusieurs lignes d'un coup (et c'est TOUJOURS possible) le ls_noserie sera le même...

    Si je comprend bien vous voulez numéroter les lots pas lignes avec rupture par ar_ref et cbMarq...

    Pour cela le seul moyen efficace est de faire une procédure stockée qui va remplacer l'insertion et utiliser une table de comptage...

    Lisez l'article que j'ai écrit sur l'auto incrémentation :
    http://sqlpro.developpez.com/cours/clefs/

    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/ * * * * *

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/04/2011, 08h32
  2. Insert/Update sur plusieurs champs
    Par steph_p dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 03/05/2010, 11h54
  3. [trigger]Probleme d'update sur une table
    Par AlternantOracle dans le forum PL/SQL
    Réponses: 5
    Dernier message: 25/02/2010, 15h11
  4. trigger "update sur insert" avec insertion multiple
    Par harf18 dans le forum Développement
    Réponses: 4
    Dernier message: 18/05/2009, 14h46
  5. Probleme avec requete UPDATE sur ACCESS
    Par Chromatic dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/01/2006, 10h03

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