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 :

activer desactiver contrainte


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 89
    Par défaut activer desactiver contrainte
    Bonjour,

    Mon probleme est le suivant :

    J'ai une table Etablissement avec comme cle primaire codeEtablissement, ce codeEtablissement est une cle etrangere dans la table PointVente.

    J'aimerai pouvoir a l'aide d'une saisie modifier ce codeEtablissement dans les deux tables via une procedure stockee, ca n'a pas marcher.
    J'ai fait une recherche sur Internet et apparemment il faut activer/desactiver les contraintes mais ca ne marche pas

    L'erreur suivante s'affiche :

    "Impossible d'activer ou de desactiver la contrainte. Consulter les erreurs precedentes."


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    alter table PointVente nocheck constraint codeEtablissement
     
     
    UPDATE PointVente
    SET codeEtablissement  = @nouveaucodeEtablissement
    WHERE codeEtablissement  = @codeEtablissement
     
    UPDATE Etablissement 
    SET codeEtablissement  = @nouveaucodeEtablissement
    WHERE codeEtablissement  = @codeEtablissement
     
    alter table PointVente check constraint codeEtablissement
    Est ce que quelqu un peut m'aider ?

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Une contrainte ne se désactive pas. Elle se détruit, et elle se remet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE ??? DROP CONSTRAINT xxx
    ALTER TABLE ??? ADD CONSTRAINT xxx [....]
    De plus pour une contrainte de clef étrangère, vous auriez pu opter pour le mode de gestion de la référence ON UPDATE CASCADE ce qui aurait fait que la modification de la valeur de référence aurait été répercutée dans la table fille sans avoir à débrancher la contrainte.

    Enfin, il vaut mieux ne jamais utiliser des clefs sémantique (code par exemple) car ce genre de problème pèse notablement sur les performances. Il vaut mieux créer une clef primaire non sémantique du genre auto incrément et doubler cette clef primaire par une clef subrogée (code par exemple). De ce fait la modif du code n'entraine aucune autre modification que la seule donnée codifiée !

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

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    et doubler cette clef primaire par une clef subrogée (code par exemple).
    Est-ce que tu parles de la création d'un index ou de la création d'une clé composite ?

    Par ailleurs je ne vois que des pertes à metter un entier autoincrémenté sans la moindre valeur sémentique plutôt qu'un entier qui en aurait.
    Une table de code postaux-noms par exempleaurait une PK qui serait le code.

    Puisque clustured index il y aura, autant qu'il ait un intérêt.

  4. #4
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Par défaut
    L'interet d'utiliser une clef primaire sans aucune sémantique business (surrogate key) est, dans le cas ou le business change et nécessite la modification de la clef naturelle (natural key), qui elle a un sens business, de ne pas avoir à repercuter ces changements dans toutes les tables ayant une relation avec cette table parent.

    Dans ce cas, on a un changement de valeur, ce qui a peu d'impact si l'on utilise le mode cascade pour mettre à jour la donnée.
    Par contre, si le type de donnée ou la taille du champ de la clef naturelle venait à changer, par exemple passer de varchar(10) à varchar(20), cette modification de structure doit être reportée sur toutes les tables pointant sur cette clef.
    Or si l'on utilise un entier auto-incrémenter sans valeur business, la modification de la clef naturelle n'entraine pas tous ces changements dans les tables ayant une référence sur la surrogate key car l'entier reste lui inchangé.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Perdre des performances à tout moment pour gagner du temps quand la structure changera contre toute attente...

    Je préfère ne pas perdre ces performances et me débrouiller le jour où les codes changeront pour peu que cela arrive avant que le SGDB soit remplacé par une technologie post 2050.

  6. #6
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Par défaut
    Sergejack,

    Il n'est pas rare que les clefs business évoluent. J'ai déjà rencontré ce cas, et je peux vous assuré qu'en plus dans une base de données ou les relations entre les tables n'étaient pas implémentées et bien entendu pas de documentation de structure, ca a été assez sport... Ayant des effets de bords sur certains processus de fin de mois, alors que le changement avait été effectué beaucoup plus tot.

    De plus, ce que vous mentionnez concernant les performances, n'est valable que lorsque la clef business est un entier. Car lors de jointures, si vous utilisez une clef business définie en varchar, le cout des jointures est plus élevé et contre-performant.
    Lorsque vous prenez l'exemple des codes postaux, en effet si vous travailler dans une table ne visant qu'un seul pays, ces codes sont fixes et semblent une clef valide.
    Ajoutez y les villes d'un pays dont la structure des codes postaux sont identiques à ceux dont vous aviez déjà, dans une table ayant une structure du genre: [code postal], [Ville]... Et vous arrivez déjà dans une solution problématique. Et pourtant ce n'est pas un gros changement, juste une expension du business dans un autre pays.

    Bien entendu, il n'existe pas, comme dans beaucoup de cas en informatique, de solution parfaite n'ayant que des pros et aucun cons...
    Personnellement, je préfère délivré une solution scalable, facilement maintenable et viable à long terme ayant des performances plus que correctes, plutot que délivrer une fusée qui pour chaque changement business nécéssite un projet en soit.
    Et je pense que du coté budget, il est aussi plus interessant pour eux de miser sur une solution flexible et facilement adaptable plutot qu'une bombe à retardement qui pour chaque changement demandé nécéssite des jours de travail.

    Comment penseriez vous à historiser l'évolution de données en utilisant comme clef primaire de votre table une clef business ?
    On en vient ici à un élément de contexte qui ne doit pas non plus être mis de coté, OLTP ou DWH ?

    Après, tout reste question de point de vue et de choix.

Discussions similaires

  1. ACTIVER/DESACTIVER CONTRAINTE
    Par cyril dans le forum Oracle
    Réponses: 4
    Dernier message: 09/11/2005, 10h00
  2. Réponses: 9
    Dernier message: 06/07/2005, 14h52
  3. [JMenuItem] activer/desactiver
    Par rvfranck dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 11/04/2005, 15h06
  4. les event de IBQuery pour activer,desactiver la Transaction?
    Par amad206 dans le forum Bases de données
    Réponses: 1
    Dernier message: 31/03/2005, 14h12
  5. Activer/Desactiver une connexion au réseau local
    Par Yodagobah dans le forum MFC
    Réponses: 7
    Dernier message: 05/01/2005, 17h17

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