Précédent   Forum du club des développeurs et IT Pro > Bases de données > MS SQL-Server > Administration
Administration Forum d'entraide sur l'administration du dataserver, via SSM ou ligne de commande, les tables système, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/01/2013, 23h08   #1
Louty.fr
Invité de passage
 
Homme Henri
Architecte de base de données
Inscription : décembre 2012
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Henri
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 : 2
Points : 2
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
Louty.fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 07h02   #2
mikedavem
Expert Confirmé Sénior

 
Avatar de mikedavem
 
Homme David BARBARIN
Inscription : août 2005
Messages : 4 137
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 4 137
Points : 8 373
Points : 8 373
Tu peux nous fournir les DDL de tes tables + index ?

++
__________________
Blog | Articles SQL Server | Profil MVP
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 22h52   #3
Louty.fr
Invité de passage
 
Homme Henri
Architecte de base de données
Inscription : décembre 2012
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Henri
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 : 2
Points : 2
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
Louty.fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 02h08   #4
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 278
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2008
Messages : 6 278
Points : 13 566
Points : 13 566
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 10h21   #5
SQLpro
Rédacteur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 12 080
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 12 080
Points : 21 678
Points : 21 678
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 10h57   #6
Louty.fr
Invité de passage
 
Homme Henri
Architecte de base de données
Inscription : décembre 2012
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Henri
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 : 2
Points : 2
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 :
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
Louty.fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 11h38   #7
aieeeuuuuu
Expert Confirmé
 
Inscription : janvier 2010
Messages : 1 690
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 690
Points : 2 666
Points : 2 666
Bonjour,

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

Code :
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 :
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 11h55   #8
Louty.fr
Invité de passage
 
Homme Henri
Architecte de base de données
Inscription : décembre 2012
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Henri
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 : 2
Points : 2
Bonjour et merci,
Citation:
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.

Citation:
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.
Louty.fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 12h20   #9
Louty.fr
Invité de passage
 
Homme Henri
Architecte de base de données
Inscription : décembre 2012
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Henri
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 : 2
Points : 2
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 :
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 )
Citation:
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é
Louty.fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 12h31   #10
aieeeuuuuu
Expert Confirmé
 
Inscription : janvier 2010
Messages : 1 690
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 690
Points : 2 666
Points : 2 666
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 :
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 10/01/2013, 13h00   #11
Louty.fr
Invité de passage
 
Homme Henri
Architecte de base de données
Inscription : décembre 2012
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Henri
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 : 2
Points : 2
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
Louty.fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h38.


 
 
 
 
Partenaires

Hébergement Web