Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 16/09/2011, 10h37   #1
Invité de passage
 
Inscription : janvier 2010
Messages : 16
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 16
Points : 2
Points : 2
Par défaut trigger update ensembliste

bonjour à tous,

j'ai une table A et une table B.
j'ai un trigger AFTER INSERT sur A qui insert des enregistrements de A dans B
seulement si le champ n°1 de A est egal à 2.

je dois ecrire maintenant le trigger AFTER UPDATE sur A.
evidemment dans celui ci je devrais faire soit un insert soit un update dans la table B selon si l'enregistrement est deja present dans la table B ou pas.
je rappelle que pour qu'un enregistrement de A soit copié dans B la condition reste la meme ( le champ n°1 de A doit etre egale à 2).

voila, j'ai besoin de votre aide pour ecrire un joli trigger ensembliste.
yarolman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 11h37   #2
Invité de passage
 
Inscription : janvier 2010
Messages : 16
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 16
Points : 2
Points : 2
je vais detaillé davantage ma situation afin de vous donner envies de m'aider

la table A se nomme "annonces" et se compose des champs :

id_annonce,code_modele,prix,annee,detail,valide,etc....

la table B se nomme "recherche " et se compose de id_annonce,code_marque,code_modele,libelle_marque,libelle_modele,prix,annee,detail

le but est de copier les enregistrements de la table annonce dont le champ valide = 2

le trigger AFTER INSERT sur la table A "annonces" est comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
INSERT INTO [site].[dbo].[recherche]
           ([id_annonce]
           ,[code_modele]
           ,[code_marque]
           ,[libelle_marque]
           ,[libelle_modele]
           ,[annee]
           ,[prixe]
           ,[detail])
 
    SELECT  i.id_annonce
           ,i.code_modele
           ,ma.code_marque
           ,ma.libelle_marque
           ,mo.libelle_modele
           ,i.annee
           ,i.prixe  
           ,i.detail
             FROM  inserted i INNER JOIN modeles mo WITH(nolock) ON i.code_modele = mo.code_modele	 INNER JOIN marques ma WITH(nolock) ON ma.code_marque = mo.code_marque WHERE i.valide=2
je dois maintenant creer le trigger AFTER UPDATE de la table A "annonces" et la je sais pas trop comment faire,
je pense que je dois forcement differencier ceux qui ont deja été inserrer dans la table recherche de ceux qui ne s'y trouvent pas encore...
mais je bloque.
je tiens a ce que mon trigger soit ensembliste car je peux faire des updates multiples.
yarolman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 18h45   #3
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bonjour,

Allons allons, bien sûr que si ça nous intéresse !

Donc pour faire l'ajout des recherches qui n'existent pas, et seulement de celles-ci, vous pouvez utiliser une demi-jointure gauche :

- à gauche de LEFT JOIN, la table actuelle
- à droite la table virtuelle inserted

Les lignes à insérer sont donc celles qui n'ont pas d'identifiant dans la table actuelle (recherche_id IS NULL).

En ce qui concerne la mise à jour, vous ne pouvez l'effectuer que sur les lignes qui existent déjà, donc l'INNER JOIN (équi-jointure) convient ici.

Cela donne :

Code :
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
CREATE TRIGGER TR_A_IU_annonces
AS
BEGIN
	SET NOCOUNT ON
 
	-- Ajoute seulement les recherches qui n'existent pas déjà dans la table recherches
	-- le LEFT JOIN + r.id_recherche IS NULL permet de faire cela
	INSERT INTO site.dbo.recherche
	(
		id_annonce
		, code_modele
		, code_marque
		, libelle_marque
		, libelle_modele
		, annee
		, prixe
		, detail
	)
	SELECT		i.id_annonce
			, i.code_modele
			, ma.code_marque
			, ma.libelle_marque
			, mo.libelle_modele
			, i.annee
			, i.prixe  
			, i.detail
	FROM		inserted AS i
	INNER JOIN	dbo.modeles AS mo
				ON i.code_modele = mo.code_modele
	INNER JOIN	dbo.marques AS ma
				ON ma.code_marque = mo.code_marque
	LEFT JOIN	site.dbo.recherche AS r
				ON r.id_recherche = i.id_recherche
	WHERE		i.valide = 2
	AND		r.id_recherche IS NULL
 
	-- Mise à jour des recherches qui existent déjà
	UPDATE		site.dbo.recherche
	SET		, code_marque = ...
			, code_modele = ...
			, libelle_marque = ...
			, libelle_modele = ...
			, prix = ...
			, annee = ...
			, detail = ...
	FROM		site.dbo.recherche AS r
	INNER JOIN	inserted AS i
				ON r.id_recherche = i.id_recherche
END
Au passage, les crochets ne servent à rien d'autre qu'à occuper de la place dans le cache, puisque vos colonnes sont proprement nommées (pas d'espaces, pas d'accents, ni de caractères cabalistiques ), donc virez-les.

N'oubliez jamais de qualifier les nom des objets que vous manipulez (table, vue, procédure stockée, fonction) par le nom du schéma auquel ils appartiennent : ça fait du travail en moins pour SQL Server et juste un peu plus pour vous

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h49.


 
 
 
 
Partenaires

Hébergement Web