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 :

probleme TRIGGER SQL


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut probleme TRIGGER SQL
    Bonjour,

    J'ai un probleme avec un TRIGGER sur SQL 2000.

    J'ai 2 tables (Tarif_FR et Tarif_BE)

    J'ai un Trigger sur Tarif_FR qui met a jour la colonne "PVHP_N_Previvionnel" de ma table "Tarif_BE", dès que la colonne "PVHP_N" de la table "Tarif-FR" est modifié.
    Voir TRIGGER 1 ci -dessous

    J'ai un également un Trigger sur ma table Tarif_BE qui lui met a jour toute les colonnes de la tables "Tarif_BE", dès que la colonne "PVHP_N_Previsionnel" de ma table "Tarif_BE" est modifiée.
    Voir TRIGGER 2 ci dessous

    Donc le Trigger 1 fonctionne très bien, par contre le trigger 2 je suis obligé de le lancé au moins 10 fois pour que toutes mes colonnes de toute ma table "Tarif_BE" soit mis a jour.

    Pouvez vous me dire d'où peux venir mon problème ?

    Merci d'avance


    TRIGGER 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ALTER TRIGGER UPDATE_TABLE ON Tarif_FR_09
    FOR UPDATE
    AS
    IF UPDATE (PVHP_N)
    UPDATE Tarif_BE_09
    SET Tarif_BE_09.Reference = Tarif_FR_09.Reference, 
    Tarif_BE_09.PVHP_N_Previsionnel = Tarif_FR_09.PVHP_N 
    FROM Tarif_FR_09
    INNER JOIN Tarif_BE_09 ON Tarif_BE_09.Reference = Tarif_FR_09.Reference


    TRIGGER 2 :

    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
    ALTER TRIGGER UPDATE_CALCUL_TABLE_BE ON Tarif_BE_09
    AFTER UPDATE
    AS
    IF UPDATE (PVHP_N_Previsionnel)
    declare @Num as numeric
    declare @TxTrans as numeric(32, 3)
    SELECT @TxTrans = Belgique from dbo.Taux_Transport_09
    UPDATE Tarif_BE_09
    set Cout_Std_N = ( Cout_Achat_N + Amort_N + R ), 
    Cout_Cat_N = ( Cout_Std_N + Mkit ), 
    PVHT_N_Previsionnel = ( PVHP_N_Previsionnel / @TxTrans ), 
    PVTTC_N_Previsionnel = 
        CASE TVA
        WHEN '21' THEN round((PVHT_N_Previsionnel * 1.21), 2)
        WHEN '6' THEN round((PVHT_N_Previsionnel * 1.06), 2)
        END, 
     
    PVTTC_N = 
        CASE TTC_Manuel
        WHEN '0' THEN PVTTC_N_Previsionnel
        WHEN '1' THEN PVTTC_N
        END,
     
    PVHT_N = 
        CASE TVA
        WHEN '21.00' THEN (PVTTC_N / 1.21)
        WHEN '6.00' THEN (PVTTC_N / 1.06)
        END, 
    PVHP_N = ( PVHT_N * @TxTrans ), 
    K_Hors_Port_N = 
        CASE Cout_Cat_N
        WHEN '0' THEN '0'
        --ELSE round ((PVHP_N / @Num), 2)
        ELSE round ((PVHP_N / Cout_Cat_N), 2)
        END, 
    @Num = (Cout_Std_N - R), 
    K_Hors_Tout_N = 
        CASE @Num
        WHEN '0' THEN '0'
        --ELSE round ((PVHP_N / @Num), 2)
        ELSE round ((PVHP_N / (Cout_Std_N - R)), 2)
        END, 
    K_Port_Compris_N = 
        CASE Cout_Cat_N
        WHEN '0' THEN '0'
        ELSE round ((PVHT_N / Cout_Cat_N), 2)
        END, 
    Pourc_Evol = 
        CASE Cout_Cat_N_1
        WHEN '0' THEN '0'
        ELSE round (((Cout_Cat_N - Cout_Cat_N_1) / Cout_Cat_N_1) * 100, 2)
        END, 
    Pourc_Diff_Reel =
        CASE PVTTC_N_1
        WHEN '0' THEN '0'
        ELSE (((PVTTC_N - PVTTC_N_1) / PVTTC_N_1) * 100)
        END, 
    Pourc_Diff_Previsionnel = 
        CASE PVTTC_N_1
        WHEN '0' THEN '0'
        ELSE(((PVTTC_N_Previsionnel - PVTTC_N_1) / PVTTC_N_1) * 100)
        END
     
    FROM Tarif_BE_09

  2. #2
    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 : 44
    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
    Par défaut
    Bonjour,

    Cela ne proviendrait-il pas du fait que vous n'utilisez pas les tables virtuelles INSERTED ou DELETED pour procéder à la mise à jour de la table Tarif_BE_09 dans le trigger UPDATE_CALCUL_TABLE_BE ?

    Veillez à indenter votre code et à utiliser la balise [code] (bouton #) quand vous postez )

    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
    ALTER TRIGGER UPDATE_TABLE
    	ON Tarif_FR_09
    	FOR UPDATE
    AS
    BEGIN
    	IF UPDATE (PVHP_N)
    	BEGIN
    		UPDATE dbo.Tarif_BE_09
    		SET BE.Reference = FR.Reference,
    			BE.PVHP_N_Previsionnel = FR.PVHP_N
    		FROM dbo.Tarif_FR_09 AS FR
    		INNER JOIN Tarif_BE_09 AS BE
    			ON BE.Reference = FR.Reference
    	END
    END
    Dans votre second trigger vous n'avez pas besoin du FROM final s'il n'y a pas de jointure à spécifier :

    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
    ALTER TRIGGER UPDATE_CALCUL_TABLE_BE
    	ON Tarif_BE_09
    	AFTER UPDATE
    AS
    BEGIN
    	IF UPDATE (PVHP_N_Previsionnel)
    	BEGIN
    		DECLARE @Num NUMERIC
    		DECLARE @TxTrans NUMERIC(32, 3)
     
    		SELECT @TxTrans = Belgique
    		FROM dbo.Taux_Transport_09
     
    		UPDATE dbo.Tarif_BE_09
    		SET Cout_Std_N = Cout_Achat_N + Amort_N + R,
    			Cout_Cat_N = Cout_Std_N + Mkit,
    			PVHT_N_Previsionnel = PVHP_N_Previsionnel / @TxTrans,
    			PVTTC_N_Previsionnel = CASE TVA
    										WHEN '21' THEN ROUND((PVHT_N_Previsionnel * 1.21), 2)
    										WHEN '6' THEN ROUND((PVHT_N_Previsionnel * 1.06), 2)
    									END,
    			PVTTC_N = CASE TTC_Manuel
    						WHEN '0' THEN PVTTC_N_Previsionnel
    						WHEN '1' THEN PVTTC_N
    					END,
    			PVHT_N = CASE TVA
    							WHEN '21.00' THEN PVTTC_N / 1.21
    							WHEN '6.00' THEN PVTTC_N / 1.06
    					END,
    			PVHP_N = PVHT_N * @TxTrans,
    			K_Hors_Port_N = CASE Cout_Cat_N
    								WHEN '0' THEN '0'
    								--ELSE ROUND ((PVHP_N / @Num), 2)
    								ELSE ROUND ((PVHP_N / Cout_Cat_N), 2)
    							END,
    			@Num = (Cout_Std_N - R),
    			K_Hors_Tout_N = CASE @Num
    								WHEN '0' THEN '0'
    								--ELSE ROUND ((PVHP_N / @Num), 2)
    								ELSE ROUND ((PVHP_N / (Cout_Std_N - R)), 2)
    							END,
    			K_Port_Compris_N = CASE Cout_Cat_N
    									WHEN '0' THEN '0'
    									ELSE ROUND ((PVHT_N / Cout_Cat_N), 2)
    							END,
    			Pourc_Evol = CASE Cout_Cat_N_1
    							WHEN '0' THEN '0'
    							ELSE ROUND (((Cout_Cat_N - Cout_Cat_N_1) / Cout_Cat_N_1) * 100, 2)
    						END,
    			Pourc_Diff_Reel = CASE PVTTC_N_1
    								WHEN '0' THEN '0'
    								ELSE (((PVTTC_N - PVTTC_N_1) / PVTTC_N_1) * 100)
    							END,
    			Pourc_Diff_Previsionnel = CASE PVTTC_N_1
    										WHEN '0' THEN '0'
    										ELSE(((PVTTC_N_Previsionnel - PVTTC_N_1) / PVTTC_N_1) * 100)
    									END
    END
    @++

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut
    Bonjour et merci de votre réponse.

    Je débutant en SQL et c'est la premiere fois que j'utilise un TRIGGER.

    Pouvez vous m'indiquer comment utiliser les tables virtuelles dans mon code.


    Merci d'avance

  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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Comme n'importe quelle autre table. Par exemple SELECT * FROM inserted.

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

  5. #5
    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 : 44
    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
    Par défaut
    Pour un peu plus de détails sur ces tables virtuelles, jetez un oeil à la première réponse que j'ai faite ici

    @++

  6. #6
    Membre régulier
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut
    OK merci du renseignement,

    Je vais essayer cela et je vous tiens au courant.

Discussions similaires

  1. Réponses: 11
    Dernier message: 17/01/2008, 18h53
  2. [pl/sql] probleme trigger oracle
    Par john123 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/12/2007, 19h27
  3. [JDBC]Probleme curseur SQL
    Par Welldone dans le forum JDBC
    Réponses: 13
    Dernier message: 11/07/2005, 16h57
  4. probleme requete sql
    Par Shosho dans le forum Langage SQL
    Réponses: 12
    Dernier message: 03/05/2005, 09h25
  5. probleme trigger
    Par samourai_alex dans le forum Oracle
    Réponses: 10
    Dernier message: 05/01/2005, 11h37

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