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 :

Problème de contrainte


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 23
    Par défaut Problème de contrainte
    Bonjour à tous
    j'ai ce 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
    16
    17
    18
    19
    USE Formation
     
    GO
     
    create table TableWithKey (colA int primary key, colB int)
     
    GO
     
    CREATE PROCEDURE AddData @a int, @b int
     
    AS
     
      INSERT INTO TableWithKey(colA, colB)
     
    VALUES(@a, @b)
     
    EXEC dbo.AddData 1, 1
     
    EXEC dbo.AddData 1, 3
    pour la deuxième exécution ça bloque , ça bloque a cause de la contrainte primary key

    Mais on nous demande de régler ce problème j'avais pensé a désactiver la contrainte mais elle n'est pas nommée, que faire ??
    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 401
    Par défaut
    Bonjour,
    Le message d'erreur est assez explicite, mais il est difficile de dire ce qui doit être corrigé ici:
    • Soit c'est la modélisation qui n'est pas bonne, et la clé primaire de la table est le couple colA et colB
    • Soit ce sont les données, et il faut changer la valeur de colA dans le deuxième insert
    • Soit tout est bon, et il faut changer le code de la procédure pour faire un update si une ligne avec la valeur de colA passée en paramètre existe déjà


    Bref difficile ici de choisir avec les éléments présentés.

    Tatayo.

  3. #3
    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
    Citation Envoyé par tafpro Voir le message
    Mais on nous demande de régler ce problème j'avais pensé a désactiver la contrainte mais elle n'est pas nommée, que faire ??
    Comme l'a déjà détaillé tatayo, supprimer la contrainte n'est pas forcément la meilleur chose à faire.
    Il vous faudra par contre la modifier, et pour retrouver son nom, vous pouvez utiliser les vues d'information schéma :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT    CONSTRAINT_NAME
    FROM    INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE    TABLE_NAME = 'TableWithKey'
        AND CONSTRAINT_TYPE = 'PRIMARY KEY'
    Bien sûr, il est préférable de nommer les contraintes pour éviter ce genre de situation, et éviter d'avoir des noms différents sur les différents environnements.

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 23
    Par défaut
    Merci ,
    Mais j'y pense quand je désactive la contrainte pour la réactiver après ça causera problème , puisque on aura des doublons , on ne peut pas utiliser un try catch ?

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 401
    Par défaut
    Par rapport au code donné en exemple, quel doit être le contenu final de la table ?

    Tatayo.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 23
    Par défaut
    On exécutera la procédure avec ces valeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EXEC dbo.AddData 1, 1
     
    EXEC dbo.AddData 1, 3
    donc 1 , 1
    1 , 3

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 401
    Par défaut
    Donc la clé primaire de la table ne peut pas être ColA, mais au mieux ColA + ColB.
    Il ne faut pas désactiver la contrainte pour la remettre plus tard (c'est totalement inutile) , mais changer celle-ci.

    Tatayo.

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 23
    Par défaut
    Bonjour ,
    j'ai oublié de preciser que c'est un exercice on nous demander d'attraper l'erreur (de le gérer nous même et pas le système)
    j'ai réussi finalement voici 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
    16
    CREATE PROCEDURE AddData @a int, @b int
     
    AS
      begin try 
      INSERT INTO TableWithKey(colA, colB)
     
    VALUES(@a, @b)
    end try
     begin catch 
    -- on affiche le message souhaite pour signaler une erreur 
    end catch 
     
     
    EXEC dbo.AddData 1, 1
     
    EXEC dbo.AddData 1, 3
    Merci pour votre aider

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

Discussions similaires

  1. [SQL] problème de contrainte externe
    Par belakhdarbts10 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 14/05/2007, 12h15
  2. [Hibernate-MySQL] Problème de contraintes ?!
    Par n@n¤u dans le forum Hibernate
    Réponses: 9
    Dernier message: 03/08/2006, 16h19
  3. Problème de contrainte sur une partie de date (l'année)
    Par shefla dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 11/04/2006, 21h50
  4. Réponses: 5
    Dernier message: 26/10/2005, 14h43
  5. Problème de contrainte dans un "CREATE DOMAIN ..."
    Par VenusX117 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 15/02/2005, 18h06

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