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 :

trigger update ensembliste


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 17
    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.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 17
    Par défaut
    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 : 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
     
    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.

  3. #3
    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,

    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 : 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
    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

    @++

Discussions similaires

  1. Ancienne valeur lors d'un Trigger Update ?
    Par Jérôme Lambert dans le forum Développement
    Réponses: 1
    Dernier message: 11/12/2006, 12h44
  2. Trigger Update (MSDE 2000 + ACCESS)
    Par Pierre Fauconnier dans le forum Développement
    Réponses: 1
    Dernier message: 26/10/2006, 08h32
  3. [trigger] update inserted?
    Par cosminutza dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/06/2005, 09h37
  4. Réponses: 2
    Dernier message: 10/05/2005, 18h15
  5. Trigger Update et Column_Updated
    Par Pm dans le forum Développement
    Réponses: 2
    Dernier message: 16/06/2004, 09h07

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