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 :

[sql2005]trigger qui s'éxecte sur toutes les lignes


Sujet :

MS SQL Server

  1. #1
    Membre habitué

    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations forums :
    Inscription : Mars 2005
    Messages : 110
    Points : 173
    Points
    173
    Par défaut [sql2005]trigger qui s'éxecte sur toutes les lignes
    bonjour, j'ai une base de données pour gerer une compagnie aerienne
    j'ai les 2 tables suivantes :
    vol(id_vol, placedispo1,placedispo2), placedispo1 et placedispo2 représentent le nombre de place disponible en 1ere classe et en 2eme classe
    client(id_cliennt,nom,prenom,id_vol,type_billet) si type_billet ='ok1' alors le client a reserver en 1ereclasse , sinon si type_billet= 'ok2' alors le client a reserver en 2eme classe
    j'ai écrit un trigger qui décrémente les cases placedispo1 ou pacedispo2en fonction du type de billet que le client a choisi

    voici mon 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    IF EXISTS (SELECT name
               FROM sysobjects
               WHERE name = 'update_places1' and type = 'tr')
    drop trigger update_places1 
    go
     
     
     
    CREATE TRIGGER  UPDATE_PLACES1
    ON client
    FOR INSERT
    AS
    declare @ty varchar(50)
    SELECT @ty = type_billet FROM client
     
    IF (@ty = 'ok1')
    begin
    SELECT * FROM VOL
    UPDATE vol
    SET PLACES_DISPO_1 = PLACES_DISPO_1 - 1
    FROM CLIENT
    WHERE client.num_vol = vol.num_vol 
    end
     
    IF (@ty = 'ok2')
    begin
    SELECT * FROM vol
    UPDATE vol
    SET PLACES_DISPO_2 = PLACES_DISPO_2 - 1
    FROM CLIENT
    WHERE client.num_vol = vol.num_vol 
    end
     
     
    GO
    mon problème est le suivant : supposons que j'ai les vols 1,2,3 , si j'ajoute un client sur le vol 1 avec type_billet ='ok1' ,tout se passe normalement j'ai la case placedispo1 qui est décrémentée !!
    mais si j'ajoute par la suite un autre client sur le vol 2 avec type_billet = ok2
    alors la j'ai la case placedispo1 du vol2 qui est décrémenté mais celle du vol 1 aussi est décrémenté , alors que normalement c'est celle du vol 2 seulement qui est decrementé
    on dirait que le trigger s'éxecute sur tout les lignes ou il a deja été éxécuté

    merci de votre aide !!!

  2. #2
    Expert confirmé
    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
    Points : 4 043
    Points
    4 043
    Par défaut
    Salut,

    Citation Envoyé par malikoo
    on dirait que le trigger s'éxecute sur tout les lignes ou il a deja été éxécuté
    Bien sûr, puisque c'est ce que tu lui demandes de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * FROM VOL
    UPDATE vol
    SET PLACES_DISPO_1 = PLACES_DISPO_1 - 1
    FROM client
    WHERE client.num_vol = vol.num_vol
    Dans un trigger tu as à ta disposition deux pseudo tables. Voir à ce sujet :
    http://sqlpro.developpez.com/cours/s...actsql/#L5.3.1
    Et les exemples à la section 5.4

    Pour ton cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE vol
    SET PLACES_DISPO_1 = PLACES_DISPO_1 - 1
    FROM INSERTED client
    WHERE client.num_vol = vol.num_vol
    A quoi sert le SELECT * FROM VOL ?
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  3. #3
    Membre habitué

    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations forums :
    Inscription : Mars 2005
    Messages : 110
    Points : 173
    Points
    173
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dans un trigger tu as à ta disposition deux pseudo tables
    oui t'a tout a fait raison , c'est les table "inserted" et "deleted"
    je les ai utilisés et ça marche impeccablement!!
    je mettrai mon code corigé dans le prohain post !!

    merci

  4. #4
    Expert confirmé
    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
    Points : 4 043
    Points
    4 043
    Par défaut
    Good, n'oublie pas ma question sur le SELECT * FROM VOL... poser du code qui retourne des jeux de résultat dans un trigger n'est pas utile, et ça risque de jeter la confusion dans ton code client, s'il y en a.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/04/2010, 14h42
  2. Réponses: 1
    Dernier message: 14/04/2010, 20h27
  3. Réponses: 3
    Dernier message: 18/12/2009, 22h03
  4. CSS texte qui se répète sur toutes les pages
    Par drogba-11 dans le forum Mise en page CSS
    Réponses: 24
    Dernier message: 13/05/2007, 21h49
  5. replace() qui s'applique sur toutes les occurences
    Par Oluha dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/03/2005, 11h27

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