lunes, 6 de junio de 2011

Deshabilitar/Habilitar todos los Foreign Key de una Base de Datos

Amigos,

Como uds saben ante operaciones tales como el borrado de datos de tablas referenciadas por FK, es necesario desahbilitar los mismos, para luego, una vez borrada la data, volver a habilitarlos.

Les dejo aquí un script que permite automatizar la tarea, espero que les sea de utilidad.

--------------------------------------------------------------------------------------------------------------------
-- Detalle: Este script permite deshabilitar/habilitar todos los FK de de una BD --
-- Gustavo Herrera para Sql Server Tips - http://gherrerasqlserver.blogspot.com/ --
---------------------------------------------------------------------------------------------------------------------

DECLARE
@TableName varchar(255),
@sql varchar(4000)

DECLARE cTable CURSOR FORWARD_ONLY FOR

-- Obtengo los nombres de las tablas de las bases de datos.
SELECT name
FROM sys.objects
WHERE
type = 'U'

OPEN cTable
FETCH NEXT FROM cTable
INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN
-- Para deshabilitar
SET @sql = 'alter table [' + @TableName + '] nocheck constraint all'

-- Para volver a habilitar
SET @sql = 'alter table ' + @TableName + ' check constraint all '

EXEC (@sql)

FETCH NEXT FROM cTable INTO @TableName
END

CLOSE cTable
DEALLOCATE cTable

3 comentarios:

  1. Como ejecuto el script ?
    Lo hago de la siguiente forma y sigue la restricción FOREIGN KEY. Gracias ...

    DECLARE
    @TableName varchar(255),
    @sql varchar(4000)

    DECLARE cTable CURSOR FORWARD_ONLY FOR

    -- Obtengo los nombres de las tablas de las bases de datos.
    SELECT name
    FROM sys.objects
    WHERE
    type = 'U'

    OPEN cTable
    FETCH NEXT FROM cTable
    INTO @TableName

    WHILE @@FETCH_STATUS = 0
    BEGIN
    -- Para deshabilitar
    SET @sql = 'alter table [' + @TableName + '] nocheck constraint all'

    TRUNCATE TABLE VR_LegajoUltimoTramo;
    TRUNCATE TABLE VR_LOTE_CN_GENERADO;
    TRUNCATE TABLE VR_LOTE_CN_RECIBIDO;
    TRUNCATE TABLE VR_ReasignacionAsiento;
    TRUNCATE TABLE VR_ReasignacionAsientoAuxiliar;
    TRUNCATE TABLE VR_ReasignacionAsientoSubauxiliar;

    -- Para volver a habilitar
    SET @sql = 'alter table ' + @TableName + ' check constraint all '

    EXEC (@sql)

    FETCH NEXT FROM cTable INTO @TableName
    END

    CLOSE cTable
    DEALLOCATE cTable

    ResponderEliminar