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 :

Un trigger qui ne réagit pas


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 13
    Points : 12
    Points
    12
    Par défaut Un trigger qui ne réagit pas
    J'ai écris un trigger dans ma base SQL Server 2000 dont voici la syntaxe:

    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
     
    CREATE TRIGGER insert_stock
    ON fMOUVEMENTS INSTEAD OF INSERT
    AS
     
    declare @id_article int
    declare @id_vehicule int
    declare @qte int
    declare @stock_init int
    declare @stock_final int
    declare @sens varchar(6)
    declare @date datetime
    declare @obs varchar(255)
     
    	BEGIN
    		SELECT @id_article = ID_ARTICLE,  @sens = TYPE_MOUVEMENT, @qte = QTE_MOUVEMENT, @date = DATE_MOUVEMENT,  @id_vehicule = ID_VEHICULE, @obs = OBS_MOUVEMENT FROM inserted
     
    		SET @stock_init = (SELECT QTE_STOCK From fARTICLES WHERE ID_ARTICLE = @id_article)
     
     
    		IF @sens = 'Sortie'
    			BEGIN
    				IF  @stock_init < @qte 
    					BEGIN
    						RAISERROR ('La quantité que vous souhaitez déstockée est indisponible',0,1)
    						ROLLBACK TRANSACTION
    					END
    				ELSE
    					BEGIN
    						SET @stock_final = @stock_init - @qte
    						INSERT INTO fMOUVEMENTS (ID_ARTICLE, DATE_MOUVEMENT, QTE_MOUVEMENT, TYPE_MOUVEMENT, ID_VEHICULE, OBS_MOUVEMENT, STOCK_INITIAL, STOCK_FINAL)
    						VALUES (@id_article, @date, @qte, @sens, @id_vehicule, @obs, @stock_init, @stock_final)
    						COMMIT TRANSACTION
    					END
     
    			END
    		ELSE
    			BEGIN
    				SET @stock_final = @stock_init + @qte
    				INSERT INTO fMOUVEMENTS (ID_ARTICLE, DATE_MOUVEMENT, QTE_MOUVEMENT, TYPE_MOUVEMENT, OBS_MOUVEMENT, STOCK_INITIAL, STOCK_FINAL)
    				VALUES (@id_article, @date, @qte, @sens, @obs, @stock_init, @stock_final)
    				COMMIT TRANSACTION
    			END
     
    	END
    J'ai dans ma base 2 tables (fARTICLES et fMOUVEMENTS) qui ont une dépendance. Visiblement la syntaxe du déclencheur est correcte mais à l'exécution j'ai le message de confirmation de mon insertion dans la table fMOUVEMENTS mais quand j'affiche les données de ma table, aucune insertion n'est faite.
    Que puis-je faire pour retrouver la cause?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    dans quel cas cela ne marche pas ?? Sortie ou Autre ??

    A mon avis enlève les commit

    Tornade

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    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 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    Vous utilisez un trigger INSTEAD OF ce qui signifie qu'il n'effectue pas l'insertion. Pour autant il liasse sciement croire qu'elle a eu lieu.

    Si vous voulez que l'insertion se fasse malgré tout, deux solutions :
    1) terminer par l'insertion
    2) prendre un trigger AFTER et non INSTEAD OF

    A +

  4. #4
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    En plus, votre trigger n'est pas ensembliste : pour plusieurs lignes insérées, que se passe-t-il à votre avis ?
    Hé bien seule la dernière est traitée par votre trigger, pas les autres !

    Autre chose dommage : si 1 mouvement sur les 25 lignes que vous venez d'insérer par exemple, est supérieur à la quantité en stock, alors les 24 qui sont correctes ne sont pas traitées. C'est un peu dommage, non ?

    Voici ce que vous pouvez faire, par exemple :

    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
    CREATE TRIGGER insert_stock
    	ON fMOUVEMENTS
    AFTER INSERT
    AS
    BEGIN
    	-- Ajoute les articles pour lesquels le mouvement est <= à la quantité en stock
    	INSERT INTO dbo.fMOUVEMENTS
    	(
    		ID_ARTICLE,
    		DATE_MOUVEMENT,
    		QTE_MOUVEMENT,
    		TYPE_MOUVEMENT,
    		ID_VEHICULE,
    		OBS_MOUVEMENT,
    		STOCK_INITIAL,
    		STOCK_FINAL
    	)
    	SELECT ID_ARTICLE,
    		DATE_MOUVEMENT,
    		QTE_MOUVEMENT,
    		TYPE_MOUVEMENT,
    		ID_VEHICULE,
    		OBS_MOUVEMENT,
    		STOCK_INITIAL,
    		STOCK_FINAL
    	FROM INSERTED
    	WHERE ART.QTE_STOCK >= I.QTE_MOUVEMENT
    	AND I.TYPE_MOUVEMENT = 'Sortie'
     
    	-- Relève les articles pour lesquels la quantité en mouvement
    	-- est supérieure à la quantité en stock
    	DECLARE @szErrMsg VARCHAR(512)
    	SELECT @szErrMsg = ISNULL(@szErrMsg, '') + CAST(ID_ARTICLE AS VARCHAR)+ ', '
    	FROM dbo.fARTICLES ART
    	JOIN INSERTED I ON I.ID_ARTICLE = ART.ID_ARTICLE
    	WHERE ART.QTE_STOCK < I.QTE_MOUVEMENT
    	AND I.TYPE_MOUVEMENT = 'Sortie'	
     
    	RAISERROR('la quantité que vous souhaitez déstocker pour les articles d''ID %s n''est pas disponible', 0, 1, @szErrMsg)
    END
    Vous pouvez éventuellement faire une jointure sur la table des articles pour avoir leur nom plutôt que leur identifiant dans le libellé du message d'erreur.

    @++

Discussions similaires

  1. Trigger qui ne marche pas sous management studio
    Par ikeabp dans le forum Développement
    Réponses: 11
    Dernier message: 21/02/2009, 14h12
  2. Un trigger qui ne réagit pas
    Par sniperricko dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/11/2008, 14h33
  3. Table qui ne réagit pas au clic d'un menu
    Par Premium dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 31/12/2006, 10h54
  4. Trigger qui rollback, mais pas complètement
    Par Monstros Velu dans le forum Développement
    Réponses: 3
    Dernier message: 20/04/2006, 10h18
  5. Editbox d'activeX qui ne réagit pas au backspace
    Par mr.saucisse dans le forum MFC
    Réponses: 18
    Dernier message: 01/03/2006, 18h35

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