Scénario :
Vous travaillez en tant que DBA ou développeur SQL Server, vous devez supprimer une table d'une base de données. Lorsque vous exécutez l'instruction drop table SchemaName.TableName, vous obtenez l'erreur ci-dessous.Msg 3726, Level 16, State 1, Line 12
Impossible de supprimer l'objet 'SchemaName.TableName' car il est référencée par une contrainte FOREIGN KEY.
Nous savons maintenant que la table est référencée par une contrainte de clé étrangère. Le problème est de savoir quelle table a cette contrainte de clé étrangère qui fait référence à cette table.
Solution :
1) Il existe plusieurs façons d'obtenir ces informations. Nous pouvons utiliser les vues système pour trouver le nom de la table qui a la contrainte de clé étrangère qui fait référence à notre table primaire.SELECT Schema_Name(Schema_id) as TableSchemaName, object_name(FK.parent_object_id) ParentTableName , object_name(FK.referenced_object_id) ReferenceTableName FROM sys.foreign_keys AS FK WHERE object_name(FK.referenced_object_id)='YourTableName' and Schema_Name(Schema_id)='YourTableSchemaName'
J'ai exécuté le script ci-dessus pour ma table client qui est présente dans le schéma dbo et voici ce que j'ai obtenu.
Comment trouver la clé étrangère de la table qui fait référence à la table dans SQL Server. |
Maintenant, nous savons que Ord est la table qui a la contrainte de clé étrangère qui fait référence à notre table. Nous pouvons continuer et supprimer la contrainte de clé étrangère, puis supprimer notre table.
2) Utilisez la procédure stockée système sp_fkeys
Nous pouvons utiliser la procédure stockée du système pour obtenir les informations sur les contraintes de clé étrangère qui font référence à notre table. Si le nom de ma table est Client, je peux exécuter le script comme ci-dessous
EXEC sp_fkeys 'Client'
Comment obtenir le nom de la contrainte de clé étrangère pour une table dans SQL Server |
Le sp_fkeys renvoie des informations très détaillées, peu de colonnes ne sont pas affichées dans l'instantané ci-dessus. voici la liste des colonnes qu'il renverra.
- PKTABLE_QUALIFIER
- PKTABLE_OWNER
- PKTABLE_NAME
- PKCOLUMN_NAME
- FKTABLE_QUALIFIER
- FKTABLE_OWNER
- FKTABLE_NAME
- FKCOLUMN_NAME
- KEY_SEQ
- UPDATE_RULE
- DELETE_RULE
- FK_NAME
- PK_NAME
Démo vidéo :Impossible de déposer l'objet car il est référencé par une contrainte de clé étrangère