OVH Cloud OVH Cloud

Les colonnes Primary et foreign Key

4 réponses
Avatar
Pierre
Bonjour,

Je souhaite identifier les colonnes PrimaryKey et ForeignKey de l'ensemble
des tables de ma base de données
une requete entre Sysobjects et sysforeignkeys me permet d'identifier les
relations entre les tables, mais je n'arrive pas à trouver la table système
qui expose les colones utiliséses dans ces relations. A moins qu'il n'existe
un identificateur de clé (primaire ou étrangère) dans syscolumns ?
J'en sais rien.

Help Please.
Thank.

4 réponses

Avatar
Laurent Moreau
Voir aide en ligne de:
syscontrains

Laurent.




"Pierre" wrote in message
news:
Bonjour,

Je souhaite identifier les colonnes PrimaryKey et ForeignKey de l'ensemble
des tables de ma base de données
une requete entre Sysobjects et sysforeignkeys me permet d'identifier les
relations entre les tables, mais je n'arrive pas à trouver la table


système
qui expose les colones utiliséses dans ces relations. A moins qu'il


n'existe
un identificateur de clé (primaire ou étrangère) dans syscolumns ?
J'en sais rien.

Help Please.
Thank.


Avatar
Synopsis
Il faut passer par la table sysreferences.
Malheureusement on a une disposition de l'information en ligne...

Les relations entre les tables systèmes :

sysreferences.fkeyid = sysobjects.id --> table qui contient la clef
étrangère
sysreferences.rkeyid = sysobjects.id --> table référente



Pour une clef étrangèe, on fait correspondre un champ
de la table avec un champ de la table référente :

maTable.ChampX = maTableReferente.champA [I]
maTable.ChampY = maTableReferente.champB [II]
maTable.ChampZ = maTableReferente.champC [III]

, par exemple pour une clef étrangère triple

Dans sysreferences, ca se traduit par :

sysreferences.Fkeyid=syscolumns.id AND sysreferences.Fkey1=syscolumns.colId
Cette relation va donner le "ChampX" de "maTable" de l'égalité [I]

sysreferences.Rkeyid=syscolumns.id AND sysreferences.Rkey1=syscolumns.colId
Cette relation va donner le "ChampA" de "maTableReferente" de l'égalité [I]

Avec cette double jointure, on retrouve les champs qui sont en
correspondances de la première
égalité.

Il faut procéder autant de fois qu'au nombre de degré de la jointure !!!
(à cause de la disposition en ligne, de la description des relations...)

Visiblement SQL server accepte au maximun des jointures à 16 relations.

Je n'ai pas trouvé d'autres solutions que d'utiliser l'opérateur UNION



=================================
select
a.id
, a.name
, c.name 'Table'
, d.name 'ReferenceTable'
, e.name 'Column'
, f.name 'ReferenceColumn'
from sysobjects a
join sysreferences b on (a.id=b.constid)
join sysobjects c on (c.id=b.fkeyid)
join sysobjects d on (d.id=b.rkeyid)
join syscolumns e on (e.id=b.fkeyid and e.colid=b.fkey1)
join syscolumns f on (f.id=b.rkeyid and f.colid=b.rkey1)
UNION
select
a.id
, a.name
, c.name 'Table'
, d.name 'ReferenceTable'
, e.name 'Column'
, f.name 'ReferenceColumn'
from sysobjects a
join sysreferences b on (a.id=b.constid)
join sysobjects c on (c.id=b.fkeyid)
join sysobjects d on (d.id=b.rkeyid)
join syscolumns e on (e.id=b.fkeyid and e.colid=b.fkey2)
join syscolumns f on (f.id=b.rkeyid and f.colid=b.rkey2)
UNION
select
a.id
, a.name
, c.name 'Table'
, d.name 'ReferenceTable'
, e.name 'Column'
, f.name 'ReferenceColumn'
from sysobjects a
join sysreferences b on (a.id=b.constid)
join sysobjects c on (c.id=b.fkeyid)
join sysobjects d on (d.id=b.rkeyid)
join syscolumns e on (e.id=b.fkeyid and e.colid=b.fkey3)
join syscolumns f on (f.id=b.rkeyid and f.colid=b.rkey3)
[....] X16
Order By 1

=====================//

C'est effectivement laborieux.

Sinon il y a toujours la procédure stockée SP_HELP maTable

declare myCursor cursor for
select name
from sysobjects
where type='U'

....
While ...
Begin
Exec('sp_help'+nomTable)
fetch myCursor ...
End
....









"Pierre" a écrit dans le message de
news:
Bonjour,

Je souhaite identifier les colonnes PrimaryKey et ForeignKey de l'ensemble
des tables de ma base de données
une requete entre Sysobjects et sysforeignkeys me permet d'identifier les
relations entre les tables, mais je n'arrive pas à trouver la table


système
qui expose les colones utiliséses dans ces relations. A moins qu'il


n'existe
un identificateur de clé (primaire ou étrangère) dans syscolumns ?
J'en sais rien.

Help Please.
Thank.


Avatar
Pierre
Merci c'est OK

"Laurent Moreau" a écrit :

Voir aide en ligne de:
syscontrains

Laurent.




"Pierre" wrote in message
news:
> Bonjour,
>
> Je souhaite identifier les colonnes PrimaryKey et ForeignKey de l'ensemble
> des tables de ma base de données
> une requete entre Sysobjects et sysforeignkeys me permet d'identifier les
> relations entre les tables, mais je n'arrive pas à trouver la table
système
> qui expose les colones utiliséses dans ces relations. A moins qu'il
n'existe
> un identificateur de clé (primaire ou étrangère) dans syscolumns ?
> J'en sais rien.
>
> Help Please.
> Thank.





Avatar
Fred BROUARD
bonjour,

il vaut mieux ne JAMAIS passer pas les tables systèmes du SGBDR. Ces tables
peuvent être modifiées sans préavis par l'éditeur puisqu'elles sont réservées à
un usage interne.
Cela a d'ailleurs été le cas entre la v7 et la v2000, des modifications ont eût
lieu dans les tables systèmes !

En revanche la norme SQL propose des vues permettant d'interroger la base sur
tous ce que l'on veut à l'exception de l'aspect "physique" des bases (fichiers
et index par exemple).

Donc, pour ton information, utiliser :
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS => nom et option des contraintes
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE => colonnes en jeu dans une contrainte.

A lire sur le sujet :
http://sqlpro.developpez.com/SQL_AZ_7b.html#SCHEMA9

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Pierre a écrit:
Bonjour,

Je souhaite identifier les colonnes PrimaryKey et ForeignKey de l'ensemble
des tables de ma base de données
une requete entre Sysobjects et sysforeignkeys me permet d'identifier les
relations entre les tables, mais je n'arrive pas à trouver la table système
qui expose les colones utiliséses dans ces relations. A moins qu'il n'existe
un identificateur de clé (primaire ou étrangère) dans syscolumns ?
J'en sais rien.

Help Please.
Thank.