Scenario:
Stai lavorando come sviluppatore di SQL Server. Hai questo requisito in cui devi creare il vincolo della chiave primaria su tutte le colonne di identità su tutte le tabelle nel database di SQL Server se non esiste.Il nome della chiave primaria dovrebbe essere Pk_SchemaName_TableName_ColumnName.
Soluzione:
Prima di tutto abbiamo bisogno di ottenere l'elenco delle tabelle che hanno una colonna di identità e il vincolo della chiave primaria non è stato creato su di esse. useremo le tabelle di sistema e le viste di sistema per ottenere tutte le tabelle con colonne di identità che non hanno vincoli di chiave primaria.Quindi useremo il cursore con SQL dinamico per generare l'istruzione Alter per la tabella per aggiungere il vincolo della chiave primaria ed eseguire lo script.
USE YourDatabaseName GO --Declare Variables DECLARE @DatabaseName AS VARCHAR(128) DECLARE @SchemaName AS VARCHAR(128) DECLARE @TableName AS VARCHAR(128) DECLARE @ColumnName AS VARCHAR(128) DECLARE CUR CURSOR FOR --Get list of tables with Identity Column --on which have no Primary Key SELECT DB_Name() AS DatabaseName ,Schema_Name(Schema_id) AS TableSchema ,OBJECT_NAME(c.OBJECT_ID) AS TableName ,c.NAME AS ColumnName FROM sys.columns c INNER JOIN sys.tables t ON c.object_id = t.object_id WHERE is_identity = 1 AND type_desc = 'USER_TABLE' EXCEPT SELECT TC.Table_Catalog AS DatabaseName ,TC.Table_Schema AS TableSchema ,TC.Table_Name AS TableName ,CCU.Column_Name AS ColumnName FROM information_Schema.Table_Constraints TC INNER JOIN Information_Schema.constraint_column_usage CCU
ON TC.Constraint_Name = CCU.Constraint_Name AND TC.Table_Name = CCU.Table_Name WHERE Constraint_Type = 'PRIMARY KEY' OPEN Cur FETCH NEXT FROM Cur INTO @DatabaseName ,@SchemaName ,@TableName ,@ColumnName WHILE @@FETCH_STATUS = 0 BEGIN --Build dynamic sql for each database DECLARE @SQL VARCHAR(MAX) = NULL SET @SQL = 'Alter Table [' + @SchemaName + '].[' + @TableName + ']' + CHAR(10) SET @SQL += 'Add Constraint [Pk_' + @SchemaName
+ '_' + @TableName
+ '_' + @ColumnName + '] ' SET @SQL += 'Primary Key ([' + @ColumnName + '])' EXEC (@SQL) PRINT @SQL FETCH NEXT FROM Cur INTO @DatabaseName ,@SchemaName ,@TableName ,@ColumnName END CLOSE Cur DEALLOCATE Cur
Se ti piace generare semplicemente le istruzioni alter per aggiungere il vincolo della chiave primaria, puoi aggiungere un commento alla parte Exec(@SQL). Lo script sopra stamperà le istruzioni Alter e potrai eseguirle a tuo piacimento.
Anche se non lo fai Non mi piace aggiungere la parte del nome dello schema al vincolo della chiave primaria, puoi rimuovere @SchemaName.
Ho eseguito la query precedente e ha creato il vincolo della chiave primaria sulle colonne di identità dove mancava. Alterare gli script generati dallo script per aggiungere il vincolo della chiave primaria alle colonne di identità
Ho verificato le tabelle e i vincoli della chiave primaria sono stati creati correttamente. Come creare un vincolo di chiave primaria su colonne di identità nel database di SQL ServerSQL Server