Scenario:
Du måste trunkera alla tabeller i SQL Server-databasen, när du kör truncate-satsen får du felet under felet.Msg 4712, Level 16, State 1, Rad 43
Kan inte trunkera tabellen 'SchemaName. TableName' eftersom den refereras av en FOREIGN KEY-begränsning.
Det enkla sättet skulle vara att släppa begränsningarna för främmande nyckel, trunkera tabellerna och återskapa begränsningen för främmande nyckel igen.
Jag skrev ett inlägg som du kan använda för att generera Drop Foreign Key Constraints i en databas. Klicka här.
Men innan vi släpper dem måste vi skapa skripten för att skapa främmande nyckelbegränsningar så att vi kan köra efter att vi har trunkerat tabellen.
Du kan använda skriptet nedan för att generera trunkeringstabellsatsen för alla användartabeller från en databas.
Select 'Truncate table '+'[' +Schema_name(Schema_id) +'].['+name+']' as TruncateTablesScript from sys.tables where is_ms_shipped=0
Skriftet nedan kan användas för att återskapa främmande nyckelbegränsningar i en databas.
;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
Hur man genererar skript för att återskapa främmande nyckelbegränsningar i SQL Server Database |
Ta resultaten från CreateForeignKeyConstraintScript-kolumnen. Jag föreslår att du kör skripten i DEV eller QA först för att se till att allt fungerar bra innan du kör i produktion.
Videodemo :Hur man skapar generera skript för att återskapa främmande nyckelbegränsningar i SQL Server