jueves, 16 de junio de 2022

Cannot truncate table 'XXXX' because it is being referenced by a FOREIGN KEY constraint.

 Cannot truncate table 'esquema.tutabla' because it is being referenced by a FOREIGN KEY constraint

Error:

Msg 4712, Level 16, State 1, Line 1

Cannot truncate table 'esquema.tutabla' because it is being referenced by a FOREIGN KEY constraint.


Solucion, primero tienes que eliminar las dependecias hijas de la tabla, despues ejecuta el siguiente script:

unicamente tienes que llenar el esquema y el nombre de tu tabla a truncar

DECLARE @Debug bit = 0;

-- List of tables to truncate
select
    SchemaName, Name
into #tables
from (values 
    ('esquema''tutabla')

as X(SchemaName, Name)


BEGIN TRANSACTION TruncateTrans;

with foreignKeys AS (
     SELECT 
        SCHEMA_NAME(fk.schema_idas SchemaName
        ,fk.Name as ConstraintName
        ,OBJECT_NAME(fk.parent_object_idas TableName
        ,SCHEMA_NAME(t.SCHEMA_IDas ReferencedSchemaName
        ,OBJECT_NAME(fk.referenced_object_idas ReferencedTableName
        ,fc.constraint_column_id
        ,COL_NAME(fk.parent_object_idfc.parent_column_idAS ColumnName
        ,COL_NAME(fk.referenced_object_idfc.referenced_column_idas ReferencedColumnName
        ,fk.delete_referential_action_desc
        ,fk.update_referential_action_desc
    FROM sys.foreign_keys AS fk
        JOIN sys.foreign_key_columns AS fc
            ON fk.object_id = fc.constraint_object_id
        JOIN #tables tbl 
            ON OBJECT_NAME(fc.referenced_object_id= tbl.Name
        JOIN sys.tables t on OBJECT_NAME(t.object_id= tbl.Name 
            and SCHEMA_NAME(t.schema_id= tbl.SchemaName
            and t.OBJECT_ID = fc.referenced_object_id
)



select
    quotename(fk.ConstraintNameAS ConstraintName
    ,quotename(fk.SchemaName+ '.' + quotename(fk.TableNameAS TableName
    ,quotename(fk.ReferencedSchemaName+ '.' + quotename(fk.ReferencedTableNameAS ReferencedTableName
    ,replace(fk.delete_referential_action_desc'_'' 'AS DeleteAction
    ,replace(fk.update_referential_action_desc'_'' 'AS UpdateAction
    ,STUFF((
        SELECT ',' + quotename(fk2.ColumnName)
        FROM foreignKeys fk2 
        WHERE fk2.ConstraintName = fk.ConstraintName and fk2.SchemaName = fk.SchemaName
        ORDER BY fk2.constraint_column_id
        FOR XML PATH('')
    ),1,1,''AS ColumnNames
    ,STUFF((
        SELECT ',' + quotename(fk2.ReferencedColumnName)
        FROM foreignKeys fk2 
        WHERE fk2.ConstraintName = fk.ConstraintName and fk2.SchemaName = fk.SchemaName
        ORDER BY fk2.constraint_column_id
        FOR XML PATH('')
    ),1,1,''AS ReferencedColumnNames
into #FKs
from foreignKeys fk
GROUP BY fk.SchemaNamefk.ConstraintNamefk.TableNamefk.ReferencedSchemaNamefk.ReferencedTableNamefk.delete_referential_action_descfk.update_referential_action_desc



-- Drop FKs
select 
    identity(int,1,1as ID,
    'ALTER TABLE ' + fk.TableName + ' DROP CONSTRAINT ' + fk.ConstraintName AS script
into #scripts
from #FKs fk

-- Truncate 
insert into #scripts
select distinct 
    'TRUNCATE TABLE ' + quotename(tbl.SchemaName+ '.' + quotename(tbl.NameAS script
from #tables tbl

-- Recreate
insert into #scripts
select 
    'ALTER TABLE ' + fk.TableName + 
    ' WITH CHECK ADD CONSTRAINT ' + fk.ConstraintName + 
    ' FOREIGN KEY ('+ fk.ColumnNames +')' + 
    ' REFERENCES ' + fk.ReferencedTableName +' ('+ fk.ReferencedColumnNames +')' +
    ' ON DELETE ' + fk.DeleteAction COLLATE Latin1_General_CI_AS_KS_WS + ' ON UPDATE ' + fk.UpdateAction COLLATE Latin1_General_CI_AS_KS_WS AS script
from #FKs fk


DECLARE @script nvarchar(MAX);

DECLARE curScripts CURSOR FOR 
    select script
    from #scripts
    order by ID

OPEN curScripts

WHILE 1=1 BEGIN
    FETCH NEXT FROM curScripts INTO @script
    IF @@FETCH_STATUS != 0 BREAK;

    print @script;
    IF @Debug = 0
        EXEC (@script);
END
CLOSE curScripts
DEALLOCATE curScripts


drop table #scripts
drop table #FKs
drop table #tables


COMMIT TRANSACTION TruncateTrans;

No hay comentarios:

Publicar un comentario

Comenta cualquier duda o recomendatorio.