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 :

Notion trigger et condition sur une partie de la table inserted


Sujet :

Développement SQL Server

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Par défaut Notion trigger et condition sur une partie de la table inserted
    Bonjour,

    Je suis débutant dans ce domaine et il y a une notion concernant les triggers que je ne comprend pas.

    Concrètement, je souhaite déterminer après un insert si une personne est présente dans un annuaire. Si elle l'est, mettre à jour son numéro sinon rajouter une ligne.
    J'ai lu que ce langage prend les insertions dans un ensemble, la table "inserted" et que parcourir cette table est inutile.
    Dans ce cas, comment émettre une condition qui dit "si une des lignes est présente, on lance un update sinon on lance un insert sur cette ligne en particulier".

    C'est le fait de ne pas mettre de boucle qui me pose problème.

    Le code :

    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 [dbo].[MaJ] ON [dbo].[personnes] 
    AFTER INSERT AS
    BEGIN TRY
    	--Recherche de la personne dans l'annuaire
    	if ((SELECT * FROM dbo.Annuaire A INNER JOIN inserted I on A.Login = I.Login WHERE inserted.Login = A.Login) = null)
    	BEGIN
    		--Si elle n'est pas présente, on ajoute le tuple dans l'annuaire téléphonique
    		SET NOCOUNT ON;
    		INSERT INTO [dbo].[Annuaire]
    			SELECT i.Login, REPLACE(i.Tel, ' ', ''), CONCAT('3', RIGHT(REPLACE(i.Tel, ' ', ''), 4)) 
    			FROM inserted i
            END
    		--Sinon on update
    ...
    En vous remerciant,
    Mel

  2. #2
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if EXISTS (SELECT * FROM dbo.Annuaire A INNER JOIN inserted I on A.Login = I.Login )
    Votre clause where est également inutile car c'est la condition de jointure...

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Par défaut
    Oui effectivement, merci pour cela.

    Mais si une partie de la table inserted match, la condition sera refusée pour l'ensemble de la table. Mon souhait c'est que la partie qui match permette de lancer un update et celle qui marche pas de lancer un update.

    Dois-je créer deux tables temporaire pour mettre les résultats des deux conditions ? du coup le if ne servirait plus...

  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
    21 999
    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 : 21 999
    Billets dans le blog
    6
    Par défaut
    Utilisez la commande MERGE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ALTER TRIGGER [dbo].[MaJ] ON [dbo].[personnes] 
    AFTER INSERT AS
       MERGE INTO dbo.Annuaire AS CIBLE
       USING (SELECT Tel FROM inserted) AS NEW
       ON CIBLE.ogin = NEW.Login
       WHEN MATCHED THEN
          UPDATE SET Tel = NEW.Tel
       WHEN NOT MATCHED THEN
          INSERT (Login, Tel)
          VALUES (Login, tel);
    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
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Par défaut
    C'est parfait, je vous remercie beaucoup

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

Discussions similaires

  1. [XL-2003] Somme conditionnelle avec condition sur une partie de cellule + RechercheV
    Par Benoit Schwob dans le forum Excel
    Réponses: 13
    Dernier message: 28/04/2011, 23h26
  2. Requete de mise à jour sur une partie de la table uniquement
    Par alex830001 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 31/10/2008, 09h56
  3. Mettre une condition sur une colonne en splitant une partie ?
    Par wormseric dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/01/2008, 11h57
  4. Requete avec condition sur une partie de l'affichage
    Par dinver78 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/07/2007, 09h19
  5. Réponses: 4
    Dernier message: 19/06/2007, 17h51

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