172 votes

Comment puis-je savoir quelle contrainte FOREIGN KEY fait référence à une table dans SQL Server ?

J'essaie de supprimer une table mais j'obtiens le message suivant :

Msg 3726, Niveau 16, Etat 1, Ligne 3
Impossible de supprimer l'objet 'dbo.UserProfile' car il est référencé par une contrainte FOREIGN KEY.
Msg 2714, Niveau 16, État 6, Ligne 2
Il existe déjà un objet nommé 'UserProfile' dans la base de données.

J'ai cherché dans SQL Server Management Studio mais je ne parviens pas à trouver la contrainte. Comment puis-je trouver les contraintes de clé étrangère ?

295voto

LittleSweetSeas Points 2292

C'est ici :

SELECT 
   OBJECT_NAME(f.parent_object_id) TableName,
   COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName
FROM 
   sys.foreign_keys AS f
INNER JOIN 
   sys.foreign_key_columns AS fc 
      ON f.OBJECT_ID = fc.constraint_object_id
INNER JOIN 
   sys.tables t 
      ON t.OBJECT_ID = fc.referenced_object_id
WHERE 
   OBJECT_NAME (f.referenced_object_id) = 'YourTableName'

De cette façon, vous obtiendrez la table de référence et le nom de la colonne.

Modifié pour utiliser sys.tables au lieu de sys.objects générique comme suggéré par le commentaire. Merci, marc_s

116voto

Vladislav Points 126

Une autre façon est de vérifier les résultats de

sp_help 'TableName'

(ou mettez simplement en surbrillance le nom du tableau cité et appuyez sur ALT+F1).

Avec le temps, j'ai décidé d'affiner ma réponse. Voici une capture d'écran des résultats que sp_help fournit. J'ai utilisé la base de données AdventureWorksDW2012 pour cet exemple. Elle contient de nombreuses informations de qualité, et ce que nous recherchons se trouve à la toute fin - surligné en vert :

enter image description here

49voto

Gayathri L Points 1145

Essayez ceci

SELECT
  object_name(parent_object_id) ParentTableName,
  object_name(referenced_object_id) RefTableName,
  name 
FROM sys.foreign_keys
WHERE parent_object_id = object_id('Tablename')

37voto

Michael Points 1380

J'ai trouvé que cette réponse était très simple et faisait l'affaire pour ce dont j'avais besoin : https://stackoverflow.com/a/12956348/652519

Un résumé du lien, utilisez cette requête :

EXEC sp_fkeys 'TableName'

Rapide et simple. J'ai pu localiser assez rapidement toutes les tables de clés étrangères, les colonnes respectives et les noms des clés étrangères de 15 tables.

Comme @mdisibio l'a noté ci-dessous, voici un lien vers la documentation qui détaille les différents paramètres qui peuvent être utilisés : https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-fkeys-transact-sql

15voto

Vinoth _S Points 43

Voici la meilleure façon de trouver la relation de clé étrangère dans toutes les bases de données.

exec sp_helpconstraint 'Table Name'

et d'une autre manière

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME='Table Name'
--and left(CONSTRAINT_NAME,2)='FK'(If you want single key)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X