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

Administration SQL Server Discussion :

Impossible de mettre en place une FK


Sujet :

Administration SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Impossible de mettre en place une FK
    Bonjour,
    Je cherche à mettre en place une clé étrangère dans une table.
    J'ai en effet trois tables liées
    - individu_activite (KeyInd (PK, int, non null), KeyAct (PK, varchar(8), non null), KeyStr (PK, char(10), non null))
    - individu (KeyInd(PK, int, non null ))
    - activite (KeyAct (PK, varchar(8), non null), KeyStr (PK, char(10), non null))

    individu_activite à une FK originaire de la table individu sur la colonne KeyInd
    et je souhaiterais rajouter une FK originaire de la table activité sur les colonnes KeyAct et KeyStr

    Malheureusement j'obtiens le message suivant "les colonnes de la table activite ne correspondent pas à une clé primaire ou à une contrainte UNIQUE". C'est pourtant bien le cas.

    J'ai vraiment besoin des lumières d'un expert.

    En vous remerciant par avance.

    Cordialement

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Tu peux nous fournir les DDL de tes tables + index ?

    ++

  3. #3
    Candidat au Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Bonsoir,
    Il n'y a aucun déclencheur DDL et la requête : select * from sys.triggers ne retourne aucun résultat

    Les index des tables concernées ne sont pour l'instant que sur les PK.

    En espérant que cette réponse te donne une idée car c'est très obscure pour moi ce problème.

    Pour information et dans le doute j'ai fait un truncate sur les tables et retenter la création de la FK mais rien de probant. Ce n'était donc pas lié aux données non-plus.
    Cordialement

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    DDL = Data Definition Language, c'est le script qui permet de créer vos tables (CREATE TABLE, CREATE INDEX).
    Aucune relation directe avec les déclencheurs.

    Vous pouvez le récupérer en sélectionnant vos tables dans SSMS, et clic droit générer un script, CREATE.

  5. #5
    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 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Louty.fr Voir le message
    J'ai en effet trois tables liées
    - individu_activite (KeyInd (PK, int, non null), KeyAct (PK, varchar(8), non null), KeyStr (PK, char(10), non null))
    - individu (KeyInd(PK, int, non null ))
    - activite (KeyAct (PK, varchar(8), non null), KeyStr (PK, char(10), non null))
    Dans votre pseudo script PK signifie sans doute PRIMARY KEY... Or une table ne peut comporter qu'une seule primary key. Vous confondez visiblement PK et FK !

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

  6. #6
    Candidat au Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Réponse SQLPro et Waldar
    Bonjours à vous deux,
    Mr Brouard : Non, je confirme qu'il n'y a pas de confusion, mais que dans la table activité la clé primaire est composée des deux colonnes (KeyAct et KeyStr).

    Mr Waldar : mille excuses interpréter un peu vite la question, le voici.

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    USE [IC_LOUTY]
    GO
     
    /****** Object:  Table [dbo].[Activite]    Script Date: 01/10/2013 10:50:03 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    SET ANSI_PADDING ON
    GO
     
    CREATE TABLE [dbo].[Activite](
    	[act_KeyStr] [char](10) NOT NULL,
    	[act_Analytique] [varchar](8) NOT NULL,
    	[act_NomCommercial] [varchar](30) NULL,
    	[act_SiteInternet] [varchar](30) NULL,
    	[act_NomComptable] [varchar](40) NOT NULL,
    	[act_DetailActivite] [varchar](500) NULL,
    	[act_DateDebut] [date] NULL,
    	[act_DateFin] [date] NULL,
    	[act_ModifieLe] [datetime] NULL,
    	[act_ModifiePar] [varchar](30) NULL,
    	[act_CreePar] [varchar](30) NULL,
    	[act_CreeLe] [datetime] NULL,
    	[act_Publiable] [char](10) NULL,
    	[act_Memo] [varchar](1000) NULL,
    	[act_ChiffreAffPrevAn] [numeric](16, 2) NULL,
    	[act_TextPresentation] [varchar](500) NULL,
    	[act_LienLogo] [varchar](50) NULL,
     CONSTRAINT [PK_Activite] PRIMARY KEY CLUSTERED 
    (
    	[act_KeyStr] ASC,
    	[act_Analytique] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
     
    SET ANSI_PADDING OFF
    GO
     
    ALTER TABLE [dbo].[Activite]  WITH CHECK ADD  CONSTRAINT [FK_Activite_Structure] FOREIGN KEY([act_KeyStr])
    REFERENCES [dbo].[Structure] ([str_Key])
    ON UPDATE CASCADE
    ON DELETE CASCADE
    GO
     
    ALTER TABLE [dbo].[Activite] CHECK CONSTRAINT [FK_Activite_Structure]
    GO
    Cordialement

  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
    Bonjour,

    Vous devez respecter l'ordre des colonnes dans votre script de définition de clef étrangère. C'est à dire indiquer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ALTER TABLE individu_activite
    		ADD CONSTRAINT FK_individu_activite_activite FOREIGN KEY(KeyStr, KeyAct) REFERENCES Activite(act_KeyStr, act_analytique )
    et non pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ALTER TABLE individu_activite
    		ADD CONSTRAINT FK_individu_activite_activite FOREIGN KEY(KeyAct, KeyStr) REFERENCES Activite(act_analytique , act_KeyStr)
    Afin que sa corresponde à la définition de votre clef primaire.

    Cependant, vous avez un problème de modélisation. Que se passera-t-il quand une activité changera de structure ? la clef primaire de l'activité changera également...
    Votre table individu_activite mériterait une vraie clef primaire en entier autoincrémenté. ça vous aurait évité le présent souci, et ça vous en éviterait bien d'autres à l'avenir...

  8. #8
    Candidat au Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Bonjour et merci,
    Vous devez respecter l'ordre des colonnes dans votre script de définition de clef étrangère.
    Je comprends et effectivement c'est une erreur.

    Cependant, vous avez un problème de modélisation. Que se passera-t-il quand une activité changera de structure ? la clef primaire de l'activité changera également...
    Votre table individu_activite mériterait une vraie clef primaire en entier autoincrémenté. ça vous aurait évité le présent souci, et ça vous en éviterait bien d'autres à l'avenir...
    Je comprends sur le fond la remarque mais le changement de structure pour une activité est justement prévu comme devant être impossible. C'est certes une erreur de modélisation, mais les données de cette table proviennent de tables d'un ERP qui utilise déjà la table individu_activité comme clé primaire.

  9. #9
    Candidat au Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut ordre des colonnes
    Sur la remarque 1 de aieeeuuuuu j'ai vérifié l'ordre des colonnes dans la requête était bon et j'ai donc toujours l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE Individu_Activite
    		ADD CONSTRAINT FK_Individu_Activite_Activite FOREIGN KEY(ida_KeyStr, ida_KeyAct) 
    		REFERENCES Activite(act_KeyStr, act_Analytique )
    L'instruction ALTER TABLE est en conflit avec la contrainte FOREIGN KEY "FK_Individu_Activite_Activite". Le conflit s'est produit dans la base de données "IC_LOUTY", table "dbo.Activite".
    Désolé

  10. #10
    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
    Ce n'est plus la même erreur, là il vous dit que vous ne pouvez pas poser la contrainte, car vous avez un problème d’intégrité dans vos données.

    que vous retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT Individu_Activite.* 
    FROM Individu_Activite
    LEFT JOIN Activite
        ON act_KeyStr = ida_KeyStr
        AND act_Analytique = ida_KeyAct 
    WHERE act_KeyStr IS NULL

  11. #11
    Candidat au Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut J'ai compris !
    Super! et merci aieeeuuuuu pour cette belle analyse.
    C'était bien un problème d'intégrité de données. Je me concentrais bêtement sur la pertinence des données de la table Activite alors que le problème venait de la table Individu_activite qui contenait des erreurs sur la colonne ida_KeyStr.
    En effet pour la valeur 10 dans la colonne Activite.act_KeyStr, j'avais 010 dans la colonne Individu_Activite.ida_KeyStr.
    C'est ballot et je vous remercie tous beaucoup pour cette assistance rapide.
    Bonne journée

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

Discussions similaires

  1. Mettre en place une passerelle sous linux
    Par gorgonite dans le forum Contribuez
    Réponses: 49
    Dernier message: 02/11/2010, 09h20
  2. Réponses: 4
    Dernier message: 09/09/2006, 11h42
  3. Réponses: 24
    Dernier message: 12/07/2006, 11h11
  4. Mettre en place une sécurité niveau utilisateur
    Par rickar dans le forum Sécurité
    Réponses: 1
    Dernier message: 22/04/2006, 16h23
  5. Comment mettre en place une structure 3 tiers.
    Par WOLO Laurent dans le forum Débats sur le développement - Le Best Of
    Réponses: 13
    Dernier message: 27/07/2003, 22h01

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