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, ntext et update en masse


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 59
    Par défaut Trigger, ntext et update en masse
    Bonjour
    On me demande de faire un trigger qui met à jour un champ Remarque d'une table Chantier pour tout les chantier d'un même projet lorsque que l'on modifie le champ Remarque de la table Chantier

    J'ai d'abord pensé à récupérer le champ Remarque dans mon trigger pas de bol c'est ntext, donc niet ensuite j'ai pensé à faire mon update et le select de remarque dans la même formule, même problème de ntext, j'ai vu qu'on pouvait tricher en passant par la table juste mis à jour pour récupérer le champ Remarque, plus de problème pour récupérer le champ mais impossible de savoir où placer la clause Where pour limiter l'Update au chantier du même Projet (message classique d'identificateur ne pouvant être lié sur CHANTIER.IDX_CHANTIER)

    Une idée pour résoudre mon problème ?

    Voila le code 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
    CREATE TRIGGER [dbo].[REMARQUE_CHANTIER_UDP] 
       ON [dbo].[CHANTIER]
       AFTER UPDATE
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;	
        -- Insert statements for trigger here
        IF ((SELECT TRIGGER_NESTLEVEL()) > 1 )
    		RETURN
     
    	IF UPDATE ([REMARQUE]) AND ((SELECT IDX_PROJET FROM [deleted]) IS NOT NULL) AND (SELECT IDX_PROJET FROM [deleted]) > 0
    	BEGIN
    		UPDATE CHANTIER SET REMARQUE = CH1.REMARQUE FROM inserted JOIN CHANTIER AS CH1 ON inserted.IDX_CHANTIER = CH1.IDX_CHANTIER  WHERE CHANTIER.IDX_CHANTIER = CH1.IDX_PROJET
    	END
    END
    GO
    Je vous passe le détail de la table Chantier (bien trop long) disons qu'il y a l'id du chantier, la remarque et l'id du projet

    EDIT: Soluce donnée par iberserk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		UPDATE C1
    			SET C1.REMARQUE = C2.REMARQUE 
    			FROM CHANTIER C1
    				INNER JOIN 
    				(SELECT CH1.IDX_PROJET, CH1.Remarque 
    				FROM CHANTIER AS CH1 
    					INNER JOIN inserted
    				ON inserted.IDX_CHANTIER = CH1.IDX_CHANTIER) C2
    			ON C1.IDX_PROJET=C2.IDX_PROJET

  2. #2
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    A la base je pense qu'il y a un problème de modélisation, si j'ai bien compris tous les chantiers d'un projet ont la même valeur dans la colonne remarque?

    Il faut déporter cette information sur une colonne de la table projet(remarque_chantiers par exemple).

    Sinon cette syntaxe devrait fonctionner dans votre TRIGGER:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
     
    UPDATE CH1 
    SET CH1.REMARQUE = inserted.REMARQUE 
    FROM inserted 
       INNER JOIN CHANTIER AS CH1 
          ON inserted.IDX_CHANTIER = CH1.IDX_CHANTIER

  3. #3
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 59
    Par défaut
    Pas tout à fait, dans notre cas on détourne une application déjà existante PlanningPME pour ceux que ça intéresse, les chantier n'ont pas forcement les mêmes remarques, on veut que ça soit le cas pour les chantiers d'un même projet. Sinon oui j'aurais effectivement fait remonter la remarque sur le projet

    Pour la requête ça ne résous pas mon problème, elle ne fait que mettre à jour le champs à une valeur dont elle viens d'être mis à jour sur un seul chantier, de plus elle ne fonctionneras pas puisque SQLserver interdit l'utilisation des champs de type ntext, text et image dans le cas des pseudo table inserted et deleted (sauf pour un instead of trigger, que je ne peux pas utiliser ici)

  4. #4
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Autant pour moi...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    UPDATE C1
    SET C1.REMARQUE = C2.REMARQUE 
    FROM CHANTIER C1
       INNER JOIN 
       (SELECT DISTINCT IDX_PROJET,CH1.Remarque 
        FROM CHANTIER AS CH1 
           INNER JOIN inserted
              ON inserted.IDX_PROJET= CH1.IDX_PROJET) C2
          ON C1.IDX_PROJET=C2.IDX_PROJET

    Avec IDX_PROJET votre FK vers PROJET sur CHANTIER

  5. #5
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 59
    Par défaut
    Presque au delà d'une petite faute:
    SELECT DISTINCT IDX_PROJET, pas de distinct et C1.IDX_PROJET

    mais surtout le Inner inner join ce fait sur IDX_CHANTIER

    Bon ça à l'air de marcher comme ça, je fais quelques tests quand même

  6. #6
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    je pense que pour le coups, le inner join sur idprojet fonctionne quand même puisque c une FK de CHANTIER d'où mon distinct...

    Mais votre code devrait fonctionner quand même

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

Discussions similaires

  1. [TRIGGER] INSERT OU UPDATE(maColonne)
    Par elsuket dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/05/2007, 10h11
  2. TRIGGER avec inserted + UPDATE sur INSERTED
    Par shaka84 dans le forum Développement
    Réponses: 3
    Dernier message: 12/04/2006, 10h26
  3. [Oracle 9i] Triggers sur les updates de tables
    Par zestrellita dans le forum Oracle
    Réponses: 12
    Dernier message: 07/12/2005, 11h32
  4. Update de masse version 2
    Par GuyLafleur dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/10/2005, 14h09
  5. update de masse
    Par Invité dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/10/2005, 01h34

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