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
