Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak dodać ograniczenie klucza podstawowego do kolumn tożsamości do wszystkich tabel w bazie danych programu SQL Server — samouczek programu SQL Server / TSQL, część 63

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
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy UNION ALL gwarantuje kolejność zestawu wyników?

  2. Jak wybrać datę bez czasu w SQL

  3. Jak uciec od ciągów znaków w SQL Server przy użyciu PHP?

  4. Instrukcje:tworzenie wyzwalacza dla daty modyfikacji automatycznej aktualizacji w programie SQL Server 2008

  5. Łączenie wartości kolumn w listę rozdzielaną przecinkami