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
