Scénario :
Vous travaillez en tant que développeur SQL Server. Vous avez cette exigence dans laquelle vous devez créer une contrainte de clé primaire sur toutes les colonnes d'identité de toutes les tables de la base de données SQL Server si elle n'existe pas.Le nom de la clé primaire doit être Pk_SchemaName_TableName_ColumnName.
Solution :
Tout d'abord, nous devons obtenir la liste des tables qui ont une colonne d'identité et la contrainte de clé primaire n'est pas créée sur elles. nous utiliserons des tables système et des vues système pour obtenir toutes les tables avec des colonnes d'identité qui n'ont pas de contraintes de clé primaire.Ensuite, nous allons utiliser le curseur avec SQL dynamique pour générer une instruction Alter pour la table afin d'ajouter une contrainte de clé primaire et exécuter le script.
USE YourDatabaseNameGO--Declare VariablesDECLARE @DatabaseName AS VARCHAR(128 )DECLARE @SchemaName AS VARCHAR(128)DECLARE @TableName AS VARCHAR(128)DECLARE @ColumnName AS VARCHAR(128)DECLARE CUR CURSORFOR--Obtenir la liste des tables avec Identity Column--sur lesquelles n'ont pas de clé primaireSELECT DB_Name() AS DatabaseName ,Schema_Name(Schema_id) AS TableSchema ,OBJECT_NAME(c.OBJECT_ID) AS TableName ,c.NAME AS ColumnNameFROM sys.columns cINNER JOIN sys.tables t ON c.object_id =t.object_idWHERE is_identity =1 AND type_desc ='USER_TABLE'EXCEPTSELECT TC .Table_Catalog AS DatabaseName ,TC.Table_Schema AS TableSchema ,TC.Table_Name AS TableName ,CCU.Column_Name AS ColumnNameFROM information_Schema.Table_Constraints TCINNER JOIN Information_Schema.constraint_column_usage CCU
ON TC.Constraint_Name =CCU.Constraint_Name AND TC.Table_Name =CCU.Table_NameWHERE Constraint_Type ='PRIMARY KEY'OPEN CurFETCH NEXTFROM CurINTO @DatabaseName ,@SchemaName ,@TableName ,@ColumnNameWHILE @@FETCH_STATUS =0BEGIN --Build dynamique sql pour chaque base de données DECLARE @SQL VARCHAR(MAX) =NULL SET @SQL ='Alter Table [' + @SchemaName + '].[' + @TableName + ']' + CHAR(10) SET @SQL +='Ajouter une contrainte [Pk_' + @SchemaName
+ '_' + @NomTable
+ '_' + @ColumnName + '] ' SET @SQL +='Clé primaire ([' + @ColumnName + '])' EXEC (@SQL) PRINT @SQL FETCH NEXT FROM Cur INTO @DatabaseName ,@ SchemaName ,@TableName ,@ColumnNameENDCLOSE CurDEALLOCATE Cur
Si vous souhaitez simplement générer les instructions alter pour ajouter une contrainte de clé primaire, vous pouvez ajouter un commentaire à la partie Exec(@SQL). Le script ci-dessus imprimera les instructions Alter et vous pourrez l'exécuter à votre convenance.
Aussi si vous ne Je n'aime pas ajouter la partie du nom du schéma à la contrainte de clé primaire, vous pouvez supprimer @SchemaName.
J'ai exécuté la requête ci-dessus et elle a créé la contrainte de clé primaire sur les colonnes d'identité là où elle manquait. Modifier les scripts générés par le script pour ajouter une contrainte de clé primaire aux colonnes d'identité
J'ai vérifié les tables et les contraintes de clé primaire ont été créées avec succès. Comment créer une contrainte de clé primaire sur les colonnes d'identité dans la base de données SQL Server