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

  1. #1
    Membre à l'essai
    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
    Points : 15
    Points
    15
    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
    Points : 13 092
    Points
    13 092
    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 à l'essai
    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
    Points : 15
    Points
    15
    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
    Points : 13 092
    Points
    13 092
    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 à l'essai
    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
    Points : 15
    Points
    15
    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'"

  7. #7
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    En effet, je n'avais pas vu que vous étiez en version 2000. Les index filtrés n'y sont pas implémentés.

    Vous pouvez modifier votre modélisation, et mettre cette colonne dans une nouvelle table référençant votre table actuelle. Ainsi, plus de NULL, donc plus de problème.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Pour répondre à votre problème il existe plusieurs solutions en version 2000.
    Le trigger en est une, une colonne calculée persistante en est une autre.

    Lisez l'article que j'ai écrit à ce sujet :

    http://blog.developpez.com/sqlpro/p5..._norme_sql_iso

    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/ * * * * *

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, 08h02
  2. [Access] supprimer les doublons sur deux champs
    Par nini94 dans le forum Langage SQL
    Réponses: 15
    Dernier message: 13/10/2006, 11h41
  3. Gestion de doublon dans un champ
    Par edonis dans le forum Access
    Réponses: 6
    Dernier message: 10/09/2006, 21h33
  4. Reperage de doublon sur plusieur champs
    Par sdblepas dans le forum Access
    Réponses: 2
    Dernier message: 29/06/2006, 18h19
  5. [SQL/access] Doublon sur un champ
    Par kor dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/01/2005, 11h21

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