KBdelete - Utilitario para borrar bases de conocimiento GeneXus.

Por mi trabajo en Concepto, me toca hacer migraciones, probar las nuevas versiones de GeneXus con sus Night Builds, reproducir errores para reportarlos etc, por lo que paso creando bases de conocimiento que luego no uso por bastante tiempo.

Por alguna extraña razón que no conozco, GeneXus no trae ninguna opción ni utilitario para borrar una base de conocimientos y todos los archivos generados con ella.

Me disponía a borrar varias KB que ya no usaba, y me di cuenta que podía ser mas rapido hacer un utilitario para borrar la KB que ponerme a borrar a mano cada una de ellas.  La idea es siempre tratar de automatizar lo automatizable. 

Para cada KB que se quiera borrar se debe hacer:

* Borrar la base de datos SQL Server correspondiente
* Borrar todos los archivos y directorios bajo dicha KB.

Para esto hice un utilitario dado un directorio busca todos los archivos GX_KB_*.MDF (nombre por defecto con que se crean las bases de datos de KB GeneXus en SQLServer) y borra la base de datos correspondiente.

Para poder borrar los archivos, en caso que se utilice .NET hay que también bajar el IIS para permitir borrar los directorios que están en directorios virtuales.

Alcanza con copiarse este codigo a un archivo KBDelete.CMD, cambiar los valores en amarillo y ejecutarlo. Va a buscar todas las KB bajo el directorio contenido en la variable raiz (en mi ejemplo es c:\models\salto y pregunta una a una si se quiere borrar la KB

Está muy poco probado, no contempla todos los casos (por ejemplo,  no lo probe con KB en Java y Ruby, tampoco cuando se tiene la base de datos en otro directorio o se le cambio el nombre a la base de datos, etc.
Dependiendo la cantidad de archivos que se tenga bajo el directorio que se quiere borrar, puede demorar bastante.

@echo off
echo ================================
echo  KBDelete - Delete a GeneXus KB 
echo  ver 1.0 - by Enrique Almeida
echo ================================

set SQLServer=NombreServidorSQLServer
set raiz=C:\Models\Salto

REM TODO - Falta borrar el directorio virtual en IIS 
REM TODO - Falta ver como manejar java
IISRESET

set /p raiz="Enter KB folder [%raiz%] : "
set /p SQLServer="Enter SQLServer name [%SQLServer%]: "

for /R %raiz% %%f in (gx_kb_*.mdf) do call :deleteMDFandFiles  %%~nf %%~dpf %%~ff "%%~tf" 
pause
exit /b

REM ===========SUBRUTUNAS =====================
:DeleteMDFandFiles
echo ===============================
set /p sigo="DELETE %2 ? "
if /i %sigo%==Y (
        sqlcmd -S %SQLServer% -Q "SELECT 'DROP DATABASE '+ base.name FROM sys.master_files arc INNER JOIN sys.databases base ON base.database_id = arc.database_id and type_desc='ROWS' and Physical_Name='%3'  " | FIND "DROP DATABASE" > drop_temporal.sql
        sqlcmd -S %SQLServer% -i drop_temporal.sql
        del drop_temporal.sql
        rmdir /q /s %2 
        echo ===============================
        )
exit /b


Mi script original, para funcionar tenia que tener una base de datos que se llamara igual la KB con GX_KB_ por delante. 
Ruben Cabrera mejoró es script para que pudiera borrar aun si el nombre de la base de datos difería del nombre por defecto, siempre emepzando con GX_KB_


Comentarios

Entradas más populares de este blog

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Aplicación monolítica o distribuida?

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.