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 pour gestion de doublon sur un champ


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Par défaut Trigger pour gestion de doublon sur un champ
    Bonjour,

    Je souhaite faire un trigger, qui puisse empêcher la création de ligne en double dans une table.

    Je vous met le code du trigger car je n'arrive pas a voir d'ou vient le problème (le trigger renvoi tout le temps l'erreur de doublon) si quelqu'un peut m'aider svp

    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
     
    CREATE TRIGGER Manage_Duplicate ON TABLE
    AFTER INSERT
    AS
     
    DECLARE @IsDuplicate char(50)
    DECLARE @Cpte char(3)
     
    BEGIN
    SET @IsDuplicate = (SELECT NOM_CHAMP FROM INSERTED)
     
    SELECT TOP 1 @Cpte= NOM_CHAMP FROM NOM_TABLE WHERE NOM_CHAMP=@IsDuplicate 
     
    IF @Cpte is not NULL
    BEGIN
    RAISERROR ('This row already exists in the table', 16, 1, @Cpte)
    ROLLBACK TRANSACTION
    END
     
    END

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    1/ la pseudo table INSERTED peut contenir plusieurs ligne : votre trigger ne le prend pas en compte.
    2/ vous avez fait un trigger AFTER insert : les données que vous êtes en train d'insérer sont déjà dans la table, c'est pourquoi vous avez toujours votre message d'erreur.
    3/ enfin et surtout : pourquoi faire un trigger là où une simple contrainte d'unicité fait l'affaire ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    3/ enfin et surtout : pourquoi faire un trigger là où une simple contrainte d'unicité fait l'affaire ?
    Pas mieux !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Par défaut
    Bonjour,

    Merci pour vos suggestions.
    J'ai testé la contrainte d'unicité, mais je n'arrive pas à gérer les NULL, qui sont détectés en tant que doublons, d'ou ma demande sur le trigger.

    Je n'ai pas trouvé mais y a t'il un moyen d'éviter le test d'unicité sur une valeur NULL ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ALTER TABLE [dbo].[TableTest1] ADD CONSTRAINT [UQ_FIELD] UNIQUE  NONCLUSTERED 
    	(
    		[FIELD]
    	)  ON [PRIMARY] 
    GO

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    C'est en effet un comportement étrange de SQL server que de considérer les null comme des doublons.

    Pour contourner, il faut faire un index unique filtré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE UNIQUE INDEX UQ_FIELD
        ON [dbo].[TableTest1] ([FIELD])
        WHERE [FIELD] IS NOT NULL

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Par défaut
    Effectivement c'est une bonne idée.
    Malheureusement, j'ai l'impression que le WHERE ne passe pas quand on fait un CREATE UNIQUE INDEX.
    Il me renvoi "Incorrect syntax near the keyword 'WHERE'"

Discussions similaires

  1. Eviter les doublons sur un champ SQL Serveur 2005
    Par crashyear dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/12/2006, 09h02
  2. [Access] supprimer les doublons sur deux champs
    Par nini94 dans le forum Langage SQL
    Réponses: 15
    Dernier message: 13/10/2006, 12h41
  3. Gestion de doublon dans un champ
    Par edonis dans le forum Access
    Réponses: 6
    Dernier message: 10/09/2006, 22h33
  4. Reperage de doublon sur plusieur champs
    Par sdblepas dans le forum Access
    Réponses: 2
    Dernier message: 29/06/2006, 19h19
  5. [SQL/access] Doublon sur un champ
    Par kor dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/01/2005, 12h21

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