Scenarie:
Du skal afkorte alle tabellerne i SQL Server-databasen, når du kører truncate-sætning, får du fejl under fejlen.Besked 4712, niveau 16, tilstand 1, linje 43
Kan ikke afkorte tabellen 'SchemaName. TableName', fordi det refereres til af en FOREIGN KEY-restriktion.
Den nemme måde ville være at droppe Foreign Key Constraints, afkorte tabellerne og genskabe Foreign Key Constraints igen.
Jeg skrev et indlæg, som du kan bruge til at generere Drop Foreign Key Constraints i en database. Klik her.
Men før vi dropper dem, skal vi generere scripts til oprettelse af fremmednøglebegrænsninger, så vi kan køre efter afkortning af tabellen.
Du kan bruge nedenstående script til at generere afkortningstabelsætning for alle brugertabeller fra en database.
Select 'Truncate table '+'[' +Schema_name(Schema_id) +'].['+name+']' as TruncateTablesScript from sys.tables where is_ms_shipped=0
Nedenstående script kan bruges til at genskabe Foreign Key Constraint i en database.
;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 ![]() |
| Sådan genereres script for at genskabe Foreign Key Constraint i SQL Server-database |
Tag resultaterne fra CreateForeignKeyConstraintScript Column. Jeg foreslår, at du kører scripts i DEV eller QA først for at sikre, at alt fungerer fint, før du kører i produktion.
Videodemo :Sådan opretter du generere scripts til at genskabe fremmede nøglebegrænsninger i SQL Server
