sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo generar secuencias de comandos para volver a crear restricciones de clave externa en la base de datos de SQL Server - Tutorial de SQL Server / TSQL, parte 73

Escenario:

Debe truncar todas las tablas en la base de datos de SQL Server, cuando cuando ejecuta la declaración truncada, obtiene el error debajo del error.
Mensaje 4712, Nivel 16, Estado 1, Línea 43
No se puede truncar la tabla 'SchemaName. TableName' porque está siendo referenciado por una restricción FOREIGN KEY.

La manera fácil sería eliminar las restricciones de clave externa, truncar las tablas y volver a crear la restricción de clave externa.

Escribí una publicación que puede usar para generar Restricciones de eliminación de clave externa en una base de datos. Haga clic aquí.
Pero antes de eliminarlos, necesitamos generar los scripts de creación de Restricciones de clave foránea para que podamos ejecutarlos después de truncar la tabla.

Puede usar el siguiente script para generar una instrucción de tabla truncada para todos los tablas de usuario de una base de datos.

Select 'Truncate table '+'['
+Schema_name(Schema_id)
+'].['+name+']' as TruncateTablesScript
from sys.tables
where is_ms_shipped=0
 
El siguiente script se puede utilizar para volver a generar la restricción de clave externa en una base de datos.

;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
 
 
 
Cómo generar un script para volver a crear una restricción de clave externa en la base de datos de SQL Server
 Tome los resultados de la columna CreateForeignKeyConstraintScript. Le sugiero que primero ejecute los scripts en DEV o QA para asegurarse de que todo funcione bien antes de ejecutarlos en Producción.



Video de demostración:cómo crear generar scripts para recrear restricciones de clave externa en SQL Server