Limpiar el esquema de una base de datos en SQL Azure tras las instalación fallida de un módulo DNN

database-cleanUna de las tareas comunes a la hora de adaptar un módulo de DotNetNuke para que sea compatible con Windows Azure, es la de adaptar los scripts de SQL de instalación para que puedan ejecutarse sobre SQL Azure. Con esta adaptación probablemente tenemos el módulo adaptado al 100%, ya que el resto del módulo debería funcionar del mismo modo en Windows Azure como en cualquier otro IIS hospedado fuera de la plataforma.

Al intentar realizar la instalación de un módulo para comprobar si funciona correctamente, probablemente nos encontremos con un problema en algún paso de la creación del esquema en SQL Azure, y en el que si estos scripts no están bien diseñados con sus correspondientes “Rollbacks”, pueden dejarnos objetos “basura” en el esquema de nuestra base de datos. Si intentamos volver a instalar el módulo, resulta que dará más problemas ya que estos objetos ya existen.

A continuación dejo un script de SQL para eliminar todos los objetos relacionados con un módulo, si es que éste se ha diseñado siguiendo las buenas prácticas de creación de módulos de DotNetNuke (todos los objetos comienzan por el nombre del módulo “<nombreModulo>_<nombreObjeto”, excepto las vistas que siguen la nomenclatura “vw_<nombreModulo>_nombreVista”.

En el ejemplo siguiente, el nombre del módulo es “mymodule”, palabra de búsqueda que debe ser reemplazada por el nombre del módulo en cuestión.

DECLARE @name varchar(250)
DECLARE @type varchar(10)
DECLARE @searchword varchar(250)
DECLARE @command VARCHAR(2000)

SET @searchword = '%mymodule_%'

DECLARE objects_cursor CURSOR FOR
(
    SELECT name, type
    FROM sys.objects 
    WHERE name LIKE @searchword
        AND (type IN ('U', 'P', 'FN', 'V', 'TF'))
)

OPEN objects_cursor

FETCH NEXT FROM objects_cursor
INTO @name, @type


WHILE @@FETCH_STATUS = 0
BEGIN    
    SELECT @command =
        CASE @type
            WHEN 'P' THEN 'DROP PROCEDURE ' + @name
            WHEN 'U' THEN 'DROP TABLE ' + @name
            WHEN 'FN' THEN 'DROP FUNCTION ' + @name
            WHEN 'TF' THEN 'DROP FUNCTION ' + @name
            WHEN 'V' THEN 'DROP VIEW ' + @name
            ELSE ''        
    END
    
    IF (@command <> '')
    BEGIN
        PRINT 'Dropping ' + @name + '...'
        EXEC (@command)
    END
    ELSE
    BEGIN
        PRINT 'WARNING: ' + @name + ' will not be deleted'
    END 
    
    FETCH NEXT FROM objects_cursor
    INTO @name, @type    
END
CLOSE objects_cursor
DEALLOCATE objects_cursor

Espero que sirva de ayuda. Un saludo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *