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ściZweryfikowano 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