Syntax Highlighter

sábado, 5 de mayo de 2012

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.

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...