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

Jak generować skrypty do ponownego tworzenia ograniczeń kluczy obcych w bazie danych SQL Server — samouczek SQL Server/TSQL — część 73

Scenariusz:

Musisz obciąć wszystkie tabele w bazie danych SQL Server, po uruchomieniu instrukcji truncate pojawia się błąd poniżej błędu.
Msg 4712, Poziom 16, Stan 1, Wiersz 43
Nie można obciąć tabeli 'SchemaName. TableName', ponieważ odwołuje się do niej ograniczenie klucza obcego.

Prostym sposobem byłoby usunięcie ograniczeń klucza obcego, obcięcie tabel i ponowne utworzenie ograniczenia klucza obcego.

Napisałem post, którego możesz użyć do wygenerowania ograniczeń klucza obcego w bazie danych. Kliknij tutaj.
Ale zanim je usuniemy, musimy wygenerować skrypty tworzenia ograniczeń kluczy obcych, abyśmy mogli uruchomić po obcięciu tabeli.

Możesz użyć poniższego skryptu, aby wygenerować instrukcję obcinania tabeli dla wszystkich tabele użytkowników z bazy danych.

Select 'Truncate table '+'['
+Schema_name(Schema_id)
+'].['+name+']' as TruncateTablesScript
from sys.tables
where is_ms_shipped=0
 
Poniższy skrypt może zostać użyty do ponownego wygenerowania ograniczenia klucza obcego w bazie danych.

;With CTE_FK AS (
SELECT Schema_Name(Schema_id) as TableSchemaName,
  object_name(FK.parent_object_id) ParentTableName,
  object_name(FK.referenced_object_id) ReferenceTableName,
  FK.name AS ForeignKeyConstraintName,c.name as RefColumnName,
  cf.name as ParentColumnList
       FROM sys.foreign_keys AS FK
       INNER JOIN sys.foreign_key_columns AS FKC
               ON FK.OBJECT_ID = FKC.constraint_object_id
               INNER JOIN sys.columns c
          on  c.OBJECT_ID = FKC.referenced_object_id
                 AND c.column_id = FKC.referenced_column_id
                 INNER JOIN sys.columns cf
          on  cf.OBJECT_ID = FKC.parent_object_id
                 AND cf.column_id = FKC.parent_column_id
                 where fk.is_ms_shipped=0
                 )
                 Select 
                 'Alter table ['+TableSchemaName+'].['+ParentTableName+']' 
                 +' Add Constraint '+ForeignKeyConstraintName+ 
                 ' Foreign Key('+stuff((
                 Select ','+ParentColumnList
                 from CTE_FK i
                 where i.ForeignKeyConstraintName=o.ForeignKeyConstraintName
                 and i.TableSchemaName=o.TableSchemaName
                 and i.ParentTableName=o.ParentTableName
                 and i.ReferenceTableName=o.ReferenceTableName
                 for xml path('')), 1, 1, '')+') References '+
                 '['+TableSchemaName+'].['+ReferenceTableName+']('+stuff((
                 Select ','+RefColumnName
                 from CTE_FK i
                 where i.ForeignKeyConstraintName=o.ForeignKeyConstraintName
                 and i.TableSchemaName=o.TableSchemaName
                 and i.ParentTableName=o.ParentTableName
                 and i.ReferenceTableName=o.ReferenceTableName
                 for xml path('')), 1, 1, '')+')'
                 AS CreateForeignKeyConstraintScript,
                 ParentTableName,
                 ReferenceTableName,
                 ForeignKeyConstraintName
                 from CTE_FK o
                 group by 
                 tableSchemaName,
                 ParentTableName,
                 ReferenceTableName,
                 ForeignKeyConstraintName
 
 
 
Jak wygenerować skrypt do ponownego utworzenia ograniczenia klucza obcego w bazie danych SQL Server
 Pobierz wyniki z kolumny CreateForeignKeyConstraintScript. Proponuję najpierw uruchomić skrypty w trybie DEV lub QA, aby upewnić się, że wszystkie działają poprawnie przed uruchomieniem w wersji produkcyjnej.



Wideo demonstracyjne:Jak utworzyć generator skrypty do odtworzenia obcych kluczy kluczowych w 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. Uzyskaj 1 górny wiersz z każdej grupy

  2. Co to jest operator logiczny AND w SQL Server — samouczek SQL Server / TSQL — część 120

  3. Zamień ciąg na inny ciąg w SQL Server (T-SQL)

  4. Tabela z wieloma wyrażeniami Wartości funkcji w porównaniu z tabelą inline Wartości funkcji

  5. Unikanie pojedynczego cudzysłowu w SQL Server