Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como gerar scripts para recriar restrições de chave estrangeira no banco de dados SQL Server - Tutorial SQL Server / TSQL Parte 73

Cenário:

Você precisa truncar todas as tabelas no banco de dados SQL Server, quando você executa a instrução truncate, obtém um erro abaixo do erro.
Msg 4712, Level 16, State 1, Line 43
Não é possível truncar a tabela 'SchemaName. TableName' porque está sendo referenciado por uma restrição FOREIGN KEY.

A maneira mais fácil seria descartar as restrições de chave estrangeira, truncar as tabelas e recriar a restrição de chave estrangeira novamente.

Eu escrevi um post que você pode usar para gerar restrições de queda de chave estrangeira em um banco de dados. Clique aqui.
Mas antes de eliminá-los, precisamos gerar os scripts create Foreign key Constraints para que possamos executar depois de truncar a tabela.

Você pode usar o script abaixo para gerar a instrução truncate table para todos os tabelas de usuário de um banco de dados.

Select 'Truncate table '+'['
+Schema_name(Schema_id)
+'].['+name+']' as TruncateTablesScript
from sys.tables
where is_ms_shipped=0
 
O script abaixo pode ser usado para gerar novamente a restrição de chave estrangeira em um banco de dados.

;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
 
 
 
Como gerar script para recriar a restrição de chave estrangeira no banco de dados SQL Server
 Pegue os resultados da coluna CreateForeignKeyConstraintScript. Sugiro que você execute os scripts em DEV ou QA primeiro para ter certeza de que tudo está funcionando bem antes de executar em Produção.



Demonstração de vídeo:como criar gerar scripts para recriar restrições de chave estrangeira no SQL Server