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