Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come generare script per ricreare i vincoli di chiave esterna nel database di SQL Server - Tutorial SQL Server/TSQL Parte 73

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