Scenariusz:
Pracujesz jako programista SQL Server. Masz to wymaganie, w którym musisz utworzyć ograniczenie klucza podstawowego we wszystkich kolumnach tożsamości we wszystkich tabelach w bazie danych SQL Server, jeśli nie istnieje.Nazwa klucza podstawowego powinna mieć postać Pk_SchemaName_TableName_ColumnName.
Rozwiązanie:
Przede wszystkim musimy uzyskać listę tabel, które mają kolumnę tożsamości i nie są na nich utworzone podstawowe ograniczenia klucza. będziemy używać tabel systemowych i widoków systemowych, aby uzyskać wszystkie tabele z kolumnami tożsamości, które nie mają ograniczeń dotyczących klucza podstawowego.Następnie użyjemy kursora z dynamicznym kodem SQL do wygenerowania instrukcji Alter dla tabeli w celu dodania ograniczenia klucza podstawowego i wykonania skryptu.
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
Jeśli chcesz po prostu wygenerować instrukcje alter w celu dodania ograniczenia klucza podstawowego, możesz dodać komentarz do części Exec(@SQL). Powyższy skrypt wydrukuje instrukcje Alter i możesz je uruchomić w dogodny sposób. nie chcesz dodawać części nazwy schematu do ograniczenia klucza podstawowego, możesz usunąć @NazwaSchematu.
Wykonałem powyższe zapytanie i utworzyłem ograniczenie klucza podstawowego w kolumnach tożsamości, w których go brakowało. Zmień skrypty generowane przez skrypt, aby dodać ograniczenie klucza podstawowego do kolumn tożsamości
Zweryfikowano tabele i podstawowe ograniczenia klucza zostały pomyślnie utworzone. Jak utworzyć ograniczenie klucza podstawowego w kolumnach tożsamości w bazie danych programu SQL Server