Scenario:
È necessario troncare tutte le tabelle nel database di SQL Server, quando quando si esegue l'istruzione truncate, viene visualizzato un errore sotto l'errore.Msg 4712, livello 16, stato 1, riga 43
Impossibile troncare la tabella 'SchemaName. NomeTabella' perché viene referenziato da un vincolo FOREIGN KEY.
Il modo più semplice sarebbe eliminare i vincoli di chiave esterna, troncare le tabelle e ricreare nuovamente il vincolo di chiave esterna.
Ho scritto un post che puoi usare per generare i vincoli di Drop Foreign Key in un database. Clicca qui.
Ma prima di eliminarli, è necessario generare gli script di creazione dei vincoli di chiave esterna in modo da poterlo eseguire dopo aver troncato la tabella.
Puoi utilizzare lo script seguente per generare l'istruzione tronca tabella per tutti gli tabelle utente da un database.
Select 'Truncate table '+'[' +Schema_name(Schema_id) +'].['+name+']' as TruncateTablesScript from sys.tables where is_ms_shipped=0
Lo script seguente può essere utilizzato per rigenerare il vincolo di chiave esterna in un 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
Come generare uno script per ricreare il vincolo di chiave esterna nel database di SQL Server |
Prendi i risultati dalla colonna CreateForeignKeyConstraintScript. Ti suggerisco di eseguire prima gli script in DEV o QA per assicurarti che tutto funzioni correttamente prima di eseguirli in Produzione.
Video Demo:come creare generare script per ricreare i vincoli di chiave esterna in SQL Server