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

PowerAMC Discussion :

script de contrainte d'intégrité incorrect


Sujet :

PowerAMC

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut script de contrainte d'intégrité incorrect
    Bonjour,

    Je travaille avec PowerAMC version 11. Sur une table du MPD, lorsque je regarde dans l'onglet aperçu le script correspondant à la création de la table, je m'aperçois que PowerAMC me génère un script de création de clé étrangère qui ne prend pas toutes les rubriques de la clé primaire de la table fils.

    La clé primaire dans la table fils est : (toto,titi) et le script généré est le script ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    alter table TABLEPERE
       add constraint FK_TABLEFILS_TABLEPERE foreign key (toto)
          references TABLEFILS (toto)
    go
    RQ : titi est également une rubrique de la table père et fait partie de la clé primaire de la table père.

    Lorsque je lance cette instruction j'ai le message d'erreur suivant :

    Aucune clé primaire ou prototype dans la table référencée 'TABLEFILS' ne correspond à la liste des colonnes de référence de la clé étrangère 'FK_TABLEFILS_TABLEPERE'.
    Impossible de créer la contrainte. Voir les erreurs précédentes.

    ...et je suis donc obligé de corriger à la main cette instruction pour intégrer la rubrique titi.

    Je ne comprends pas comment j'ai pu arriver à une telle situation.

    Merci pour une éventuelle réponse.

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Merci de fournir le script exact pour les instructions CREATE TABLE et ALTER TABLE des deux tables concernées.

    Quel SGBD cible ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,

    Voici le code de création des tables père et fils :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    --
    -- Création de la table Père
    --
    create table TABLEPERE (
       toto          char(10)             not null,
       titi         numeric              not null,
       rub10        char(1)              null,
       rub11            char(6)              null,
    
       constraint PK_TABLEPERE primary key  (toto, titi)
    )
    go
    
    --
    -- Création de la table fils
    --
    create table TABLEFILS (
       toto          char(10)             not null,
       tata         varchar(4)           not null,
       tutu       smallint             not null,
       rub1      char(1)              not null,
       rub2        char(4)              not null,
       rub3         decimal(11,4)        null,
       titi         numeric              null,
       constraint PK_TABLEFILS primary key  (toto, tata, tutu)
    )
    go
    
    
    alter table TABLEFILS
       add constraint FK_TABLEFILS_TABLEPERE foreign key (titi)
          references TABLEPERE (titi)
    go
    En fait, depuis hier, j'ai trouvé une solution en me plaçant sur la contrainte intégrité et dans l'onglet jointure j'ai ajouté la rubrique toto dans la colonne de la table parent et également toto dans la colonne de la table enfant (la rubrique titi était déjà présente). Après validation, lorsque je regarde
    dans l'onglet apercu de la table TABLEFILS j'ai bien le bon code cette fois-ci qui fonctionne à l'exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    alter table TABLEFILS
       add constraint FK_TABLEFILS_TABLEPERE foreign key (titi, toto)
          references TABLEPERE (titi, toto)
    go

    Ma question est donc la suivante : pourquoi la génération du MPD par mon MCD ne m'a pas fourni directement le bon code (c'est à dire qu'il n'a pas remonté la seconde rubrique toto dans l'onglet jointure de la contrainte référentielle) et que je suis obligé de reprendre le MPD à la main ? Est-ce normal ou bien ai-je oublié de faire quelque chose dans le MCD ?

    Merci.

    NB : je travaille avec sql server 2000.

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Quand on analyse votre MPD, on constate que, soit vous n’êtes pas passé par l’étape MCD, soit que vous avez modifié le résultat de la dérivation du MCD en MPD. En effet, l’AGL produit un MPD dans lequel on a pour la table TABLEFILS :
    — Soit une clé étrangère dont les éléments toto et titi sont tous deux à NULL (conséquence d’une cardinalité 0,1 entre TABLEPERE (d’identifiant {toto, titi} et TABLEFILS),

    — Soit une clé étrangère dont aucun des éléments (toto et titi) n'est à NULL (conséquence d’une cardinalité 1,1 entre TABLEPERE et TABLEFILS),

    Mais jamais un mix NOT NULL / NULL, qui ne peut exister que si l'on modifie ce que l'AGL a génénré.

    Cela dit, en construisant vos tables directement au niveau MPD, puis en les connectant, j’observe un comportement tout à fait normal de la part de l’AGL quant aux clés primaires et étrangères :



    Avec ensuite une génération de code SQL conforme à ce que vous attendez. Vous avez vraisemblablement fait une fausse manip à un moment donné. Pour que vous en ayez le cœur net, je vous invite à procéder comme j’ai fait.

    Maintenant, si dans certaines lignes de la table TABLEFILS l’attribut titi est marqué NULL alors que l’attribut toto contient une valeur, par exemple 'xyzt', pour SQL Server (et les autres), l’information est toujours réputée valide, même si cette valeur 'xyzt' n’existe pas dans la table TABLEPERE (attribut toto) : Danger...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour votre réponse et la mise en garde à la fin (très important) ! Je vais faire l'exercice demandé de recréation et voir où j'ai oublié quelque chose.

Discussions similaires

  1. Merise : Contrainte d'intégrite fonctionnelle
    Par new_wave dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 22/06/2022, 11h51
  2. contrainte d'intégrité super dur a gérer !
    Par RockLee69 dans le forum Oracle
    Réponses: 3
    Dernier message: 30/11/2005, 15h02
  3. Réponses: 5
    Dernier message: 26/10/2005, 14h43
  4. [debutant] Contraintes d'intégrité définies sur un objet
    Par maysa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/05/2004, 14h57
  5. Question sur les contraintes d'intégrités
    Par eGGyyS dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/04/2004, 13h51

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