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

Langage SQL Discussion :

trigger delete pour plusieurs lignes


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut trigger delete pour plusieurs lignes
    Bonjour,
    j'ai deux tables T1 et T2, j'ai besoin d'agir sur une ligne de T1 dès qu'on supprime une ligne de T2. Cett action dépend d'une autre table (T3) et de la ligne qui vient d'être supprimé dans T2 : dans certains cas je fais juste un update dans T1, et dans d'autres je fais aussi un delete.

    voici ce que j'ai écrit :
    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
     
    CREATE TRIGGER [tg_deleteBCitem] ON [T2] 
    FOR DELETE
    AS BEGIN
    DECLARE
    @nor varchar(15), @article varchar(20), @qtite int
    SET @nor=(SELECT CHAMP1 FROM Deleted)
    SET @article=(SELECT CHAMP2 FROM Deleted)
     
    SET @qtite=(SELECT SUM(CHAMP3) FROM [T3] WHERE (CHAMP2=@article AND CHAMP1=@nor))
     
    IF (@qtite IS NULL)
         DELETE FROM [T1] WHERE ( CHAMP4=@nor AND CHAMP5=@article)
    ELSE
         UPDATE [T1] SET CHAMP6=@qtite WHERE ( CHAMP4=@nor AND CHAMP5=@article)
     
    END
    Cela marche pour la suppression d'une seule ligne, mais évidemment pas pour la suppression de plusieurs ligne.
    Ce qui serait super c'est qu'il existe une fonction du genre "For each row",
    autrement je ne vois pas comment ré-écrire mon trigger.

    Quand pensez-vous ?
    merci de vos conseils.
    PS: je suis sur MS Server

  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
    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
     
    CREATE TRIGGER tg_deleteBCitem ON T2
    FOR DELETE 
    AS BEGIN 
    DECLARE @qtite int 
     
    SELECT @qtite=SUM(CHAMP3) 
    	    FROM T3 JOIN deleted D 
    			ON D.CHAMP2=T3.CHAMP2 
    			AND D.CHAMP1=T3.CHAMP1  
     
    IF (@qtite IS NULL) 
         DELETE 
         FROM T1 
         WHERE CHAMP4 IN (SELECT CHAMP1 
    		      FROM Deleted) 
    	    AND CHAMP5 in (SELECT CHAMP2 
                               FROM Deleted)  
    ELSE 
         UPDATE T1 SET CHAMP6=@qtite
         WHERE CHAMP4 IN (SELECT CHAMP1 
    		      FROM Deleted) 
         AND CHAMP5 in (SELECT CHAMP2 
                        FROM Deleted)   
    END

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Laurent ta solution ne fonctionne pas, car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE CHAMP4 IN (SELECT CHAMP1 FROM Deleted) 
      AND CHAMP5 IN (SELECT CHAMP2 FROM Deleted)
    CHAMP1 et CHAMP2 peuvent provenir de lignes différentes, je ne connais pas assez SqlServer mais sous ORACLE on a le droit d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (CHAMP4, CHAMP5) IN (SELECT CHAMP1, CHAMP2 FROM Deleted)
    et là on est sur que les deux valeurs sont dans la même ligne.
    De plus je crois que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT @qtite=SUM(CHAMP3) 
           FROM T3 JOIN deleted D 
             ON D.CHAMP2=T3.CHAMP2 
             AND D.CHAMP1=T3.CHAMP1
    ne ramène pas le résultat escompté (total de SUM(CHAMP3), au lieu de SUM(CHAMP3) pour la clé CHAMP1, CHAMP2, ajouter le group by ne résoudrait pas le problème, puisqu'il y aurait plusieurs lignes ramenées par le select).

  4. #4
    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
    Normal,
    Sans jeu d'essai ni de script de définition des tables, on opère dans un champs trop large. Et de plus, on n'a pas la possibilité de tester.

    Mais en tout cas, Je n'ai fais qu'interpreter son premier query !

  5. #5
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut
    merci de vos réponses, je testerai ça mardi (je suis en stage, donc je bosse pas le we). Par contre si ç apeut vous aider voila un jeu de données test :
    [T1](champ4,champ5,champ6,...)
    'commande1','article1','5'
    'commande1','article2','5'
    'commande2', 'article1','6'
    'commande2','article3','5'

    [T2](champ1,champ2,champ7,...)
    'commande1','article1','301'
    'commande1','article1','200'
    'commande1','article2','504'
    'commande2','article1','654'
    'commande2','article3','231'
    'commande2','article3','300'

    [T3](champ1,champ2,champ3,...)
    'commande1','article1','3'
    'commande1','article1','2'
    'commande1','article2','5'
    'commande2','article1','6'
    'commande2','article3','2'
    'commande2','article3','3'


    champ6 et champ3 correspondent en fait à des quantités, et champ7 au prix.
    [T2] n'a pas d'infos sur la quantité : c'est [T3] qui les a. Si une ligne de [T2]est supprimé, celle à laquelle elle est associée dans [T3] viendra juste d'être supprimé.
    En fait, T1 est sur un serveur différent de T2 et T3. T1 est utilisé pour faire des bilans des activités inscrites dans T2 et T3 (entre autres) et ne récupère donc que qques infos dans celles-ci.

    Dans T2 il peut y avoir des suppressions concernant une sule ligne, mais aussi une commande (on supprime donc toutes les lignes liées à celle-ci) et c'est dans ce cas là que j'ai un problème

  6. #6
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut
    ce sujet n'a pas l'air d'intéressé...mais bon, j'ai finalement trouvé une solution à mon problème.
    merci à ceux qui m'ont aidé.
    voilà mon trigger (si ça intéresse qqun) :
    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
     
    CREATE TRIGGER [tg_deleteBCitem] ON [Aff_T2] 
    FOR DELETE 
    AS BEGIN 
    DECLARE 
    @nor varchar(15), @article varchar(20), @qtite int 
    SET @qtite=(SELECT COUNT(*) FROM Deleted)
     
    IF (@qtite=1) BEGIN
    	SET @nor=(SELECT champ1 FROM Deleted) 
    	SET @article=(SELECT champ2 FROM Deleted) 
    	SET @qtite=(SELECT SUM(champ3) FROM [Aff_T3] WHERE (champ2=@article AND champ1=@nor)) 
     
    	IF (@qtite IS NULL) 
         		DELETE FROM [Aff_T1] WHERE ( champ4=@nor AND champ5=@article) 
    	ELSE 
         		UPDATE [Aff_T1] SET champ6=@qtite WHERE ( champ4=@nor AND champ5=@article) 
    END
    ELSE BEGIN
    	DELETE FROM Aff_T1 WHERE (champ4) IN (SELECT champ1 FROM Deleted)
    END
     
    END

  7. #7
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Merci
    Merci d'avoir poster la solution, cela m'a beaucoup aider

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

Discussions similaires

  1. ON DUPLICATE KEY UPDATE pour plusieurs lignes
    Par raphael_kindt dans le forum Requêtes
    Réponses: 1
    Dernier message: 09/11/2009, 12h45
  2. Modification Ruler level pour plusieurs lignes
    Par vonwolf dans le forum VBA PowerPoint
    Réponses: 0
    Dernier message: 14/10/2009, 11h22
  3. généralisation d'un code pour plusieurs lignes XL
    Par oliver75 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 20/07/2007, 17h58
  4. [VBA-E] répéter un tri décroissant pour plusieurs lignes
    Par rajmoule dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 30/03/2006, 17h12
  5. [excel vba]case à cocher dans excel pour plusieurs lignes
    Par fcoisb dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/03/2005, 11h23

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