Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment générer des scripts pour recréer des contraintes de clé étrangère dans la base de données SQL Server - Tutoriel SQL Server / TSQL Partie 73

Scénario :

Vous devez tronquer toutes les tables de la base de données SQL Server, lorsque vous exécutez l'instruction truncate, vous obtenez une erreur inférieure à l'erreur.
Msg 4712, niveau 16, état 1, ligne 43
Impossible de tronquer la table 'SchemaName. TableName' car il est référencé par une contrainte FOREIGN KEY.

Le moyen le plus simple serait de supprimer les contraintes de clé étrangère, de tronquer les tables et de recréer à nouveau la contrainte de clé étrangère.

J'ai écrit un article que vous pouvez utiliser pour générer des contraintes de clé étrangère Drop dans une base de données. Cliquez ici.
Mais avant de les supprimer, nous devons générer les scripts de création de contraintes de clé étrangère afin de pouvoir les exécuter après avoir tronqué la table.

Vous pouvez utiliser le script ci-dessous pour générer l'instruction de table tronquée pour tous les tables utilisateur d'une base de données.

Sélectionnez 'Truncate table '+'['+Schema_name(Schema_id)+'].['+name+']' as TruncateTablesScriptfrom sys.tableswhere is_ms_shipped=0 
 
Le script ci-dessous peut être utilisé pour regénérer la contrainte de clé étrangère dans une base de données.

;Avec 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 ) Sélectionnez 'Alter table ['+TableSchemaName+'].['+ParentTableName+']' +' Add Constraint ' +ForeignKeyConstraintName+ ' Clé étrangère('+truc(( Sélectionnez ','+ParentColumnList de CTE_FK i où i.ForeignKeyConstraintName=o.ForeignKeyConstraintName et i.TableSchemaName=o.TableSchemaName et i.ParentTableName=o.ParentTableName et i.ReferenceTableName=o .ReferenceTableName for xml path('')), 1, 1, '')+') References '+ '['+TableSchemaName+'].['+ReferenceTableName+']('+stuff(( Select ','+RefColumnName de CTE_FK i où i.ForeignKeyConstraintName=o.ForeignKeyConstraintName et i.TableSchemaName=o.TableSchemaName et i.ParentTableName=o.ParentTableName et i.ReferenceTableName=o.ReferenceTableName pour le chemin xml ('')), 1, 1, '' )+')' AS CreateForeignKeyConstraintScript, ParentTableName, ReferenceTableName, ForeignKeyConstraintName de CTE_FK ou grouper par tableSchemaName, ParentTableName, ReferenceTableName, ForeignKeyConstraintName
 
 
 
Comment générer un script pour recréer une contrainte de clé étrangère dans la base de données SQL Server
 Prenez les résultats de la colonne CreateForeignKeyConstraintScript. Je vous suggère d'exécuter d'abord les scripts en DEV ou QA pour vous assurer que tout fonctionne correctement avant de les exécuter en production.



Démo vidéo :comment créer un générateur scripts pour recréer des contraintes de clé étrangères dans SQL Server