En ciertas oportunidades, nos encontramos frente a la inicializacion de una base de datos especifica, la cual, ya fue diseñada y tiene todas sus constraint y posibles triggers.
Para no tener que deshabilitar a mano cada una de las mismas para luego tener que ejecutar la insercion de datos y al final, volver a habilitar los mismos, es que cree este script, que siguiendo su correcta secuencia, nos ahorra bastante tiempo.
Como primer paso, creo un cursor que recorra la totalidad de los objetos de dicha base de datos, deshabilitando todos los contraint de cada tabla, al igual que los triggers, si es que los hay, dicho script es el siguiente:
DECLARE @Contraint VARCHAR(255)
DECLARE @Esquema VARCHAR(255)
DECLARE @Tabla VARCHAR(255)
DECLARE @Str VARCHAR(MAX)
DECLARE CONSTRINT_CURSOR CURSOR FOR
SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint, SCHEMA_NAME(schema_id) AS SchemaName, OBJECT_NAME(parent_object_id) AS TableName
FROM sys.objects
WHERE type_desc LIKE '%CONSTRAINT'
OPEN CONSTRINT_CURSOR
FETCH NEXT FROM CONSTRINT_CURSOR INTO @Contraint, @Esquema, @Tabla
WHILE @@FETCH_STATUS = 0
BEGIN
--- Deshabilito Trigger
SET @Str= ''
SET @Str = 'ALTER TABLE ' + @Esquema + '.' + @Tabla + 'DISABLE TRIGGER ALL'
EXEC (@Str)
--- Deshabilito Contraint
SET @Str= ''
SET @Str = 'ALTER TABLE ' + @Esquema + '.' + @Tabla + 'NOCHECK CONSTRAINT' + @Contraint
EXEC (@Str)
FETCH NEXT FROM CONSTRINT_CURSOR INTO @Contraint, @Esquema, @Tabla
END
CLOSE CONSTRINT_CURSOR
DEALLOCATE CONSTRINT_CURSOR
Una vez que ejecutamos el mismo, tenemos la base de datos en condiciones para poder realizar los DELETE e INSERT necesarios a nuestras tablas parametricas.
DELETE FROM Tabla1
INSERT INTO Tabla 1 (Campo1, Campo2) SELECT 1, 'How are you?'
Cuando tengamos todos los datos como queremos que esten cargados, tenemos que volver a realizar la habilitacion de los Contraint y Trigger, para que la misma quede consistente.
Para esto, volvemos a ejecutar el cursor del primer paso, pero con la siguiente modificacion.
DECLARE @Contraint VARCHAR(255)
DECLARE @Esquema VARCHAR(255)
DECLARE @Tabla VARCHAR(255)
DECLARE @Str VARCHAR(MAX)
DECLARE CONSTRINT_CURSOR CURSOR FOR
SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint, SCHEMA_NAME(schema_id) AS SchemaName, OBJECT_NAME(parent_object_id) AS TableName
FROM sys.objects
WHERE type_desc LIKE '%CONSTRAINT'
OPEN CONSTRINT_CURSOR
FETCH NEXT FROM CONSTRINT_CURSOR INTO @Contraint, @Esquema, @Tabla
WHILE @@FETCH_STATUS = 0
BEGIN
--- Deshabilito Trigger
SET @Str= ''
SET @Str = 'ALTER TABLE ' + @Esquema + '.' + @Tabla + 'ENABLE TRIGGER ALL'
EXEC (@Str)
--- Deshabilito Contraint
SET @Str= ''
SET @Str = 'ALTER TABLE ' + @Esquema + '.' + @Tabla + 'CHECK CONSTRAINT' + @Contraint
EXEC (@Str)
FETCH NEXT FROM CONSTRINT_CURSOR INTO @Contraint, @Esquema, @Tabla
END
CLOSE CONSTRINT_CURSOR
DEALLOCATE CONSTRINT_CURSOR