Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/02/2011, 15h37   #1
Membre du Club
 
Inscription : octobre 2009
Messages : 59
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 59
Points : 69
Points : 69
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 :
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 :
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
The zxeno prophet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 16h17   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
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 :
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
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 16h33   #3
Membre du Club
 
Inscription : octobre 2009
Messages : 59
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 59
Points : 69
Points : 69
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)
The zxeno prophet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 16h50   #4
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Autant pour moi...

Code :
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
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 17h13   #5
Membre du Club
 
Inscription : octobre 2009
Messages : 59
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 59
Points : 69
Points : 69
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
The zxeno prophet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 17h57   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
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
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 12h04   #7
Membre du Club
 
Inscription : octobre 2009
Messages : 59
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 59
Points : 69
Points : 69
Ah non puisque que la relation de chantier vers projet est n-1, donc il y aurait eu plusieurs chantiers avec ce join
Enfin bon ça marche merci pour le coup de main
The zxeno prophet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h58.


 
 
 
 
Partenaires

Hébergement Web