APSQL

Identifier les clés primaires

Les contraintes d'intégrités sont la base de la bonne conception des bases de données. Il est donc nécessaire de les mettre en place. Mais en intervenant sur une base existante il est important de contrôler que chaque table possède bien une clé primaire. Ce travail peut difficilement être réalisé manuellement.

Il est donc nécessaire de passer par une requête SQL pour identifier les tables qui ne possèdent pas de clé primaire. La vue système sys.key_constraints contient la définition de toutes les contraintes de clé primaire et d'unicité. Pour lister l'ensemble des tables possèdant une clé primaire une restriction sera nécessaire sur la colonne type pour se limiter au type PK (Primary Key), les colonnes parent_object_id et schema_id permettent d'obtenir des informations relatives au nom de la table et au nom du schéma.Bien entendu le nom des tables et des schéma sera établi grâce aux informations présentes au travers de sys.tables et sys.schemas.

SELECT schemas.name,tables.name, key_constraints.name
FROM sys.key_constraints
INNER JOIN sys.tables ON tables.object_id=key_constraints.parent_object_id
INNER JOIN sys.schemas ON key_constraints.schema_id=schemas.schema_id
WHERE key_constraints.type='PK';

Il faut maintenenant comparer cette liste à la liste complète des tables présentes dans la base de données afin de résoudre la problématique initiale. Pour cela une nouvelle requête va être menée sur les vues sys.tables et sys.schemas en se limitant aux seules tables définies par les utilisateurss (type='U'). Pour chaque table utilisateur identifiée la requête exposé précédement va être exécutée afin de savoir s'il existe une clé primaire. C'est uniquement dans le cas ou cette sous requête ne va pas retourner d'information qu'il est nécessaire d'afficher le nom complet de la table.

			
SELECT s.name +'.'+ t.name as "Tables sans PK"
FROM sys.tables t 
INNER JOIN sys.schemas s ON t.schema_id=s.schema_id
WHERE t.type='U'
AND NOT EXISTS(SELECT *
  FROM sys.key_constraints
  WHERE parent_object_id=t.object_id
    AND schema_id=s.schema_id
    AND type='PK');