Matar proceso en Oracle (y PowerBuilder)

Siguiendo el [artículo anterior] (en el que construíamos una Select para consultar los procesos que estaban bloqueando tablas o filas en nuestra Base de Datos) ahora veremos cómo se pueden terminar (o matar) estos procesos por SQL. Como en casos anteriores, esto funciona en Oracle , y hay que tener privilegios de DBA.

La sentencia es bastante simple:
ALTER SYSTEM KILL SESSION 'SID,SERIAL#';
Es decir, las dos últimas columnas que recuperamos en la Select de los bloqueos (ver <artículo anterior>son las que utilizaremos para identificar el proceso y acabarlo. La sentencia del KILL SESSION queda del tipo
ALTER SYSTEM KILL SESSION '1587,58656';

¿Y como ejecutar esto en un botón de PowerBuilder?

Se coge el SID y #Serial del proceso a matar y se construye una cadena que ejecutaremos con un EXECUTE INMEDIATE. Ya que tenemos la DataWindow con la consulta hecha, podemos usarla para que coja el SID y #Serial de la fila que seleccione el usuario.
Este es el código de mi botón.

Long  lFila
String  sSID, sSerial, sUser, sObjeto, sKILL
lFila = dw_1.GetSelectedRow(0)

IF lFila = 0 THEN
  MessageBox(Parent.Title, "Seleccione un proceso.")
  Return
END IF

sSID    = dw_1.GetItemString(lFila, "sid")
sSerial = dw_1.GetItemString(lFila, "serial")
sUser   = dw_1.GetItemString(lFila, "usuario_sist_operat")
sObjeto = dw_1.GetItemString(lFila, "dba_objects_objeto_bloqueado ")
sKILL = " ALTER SYSTEM KILL SESSION '" + sSID + "," + sSerial + "'; "

IF MessageBox(Parent.Title, "¿Desea matar el proceso '" + sSID + "," + sSerial + "' de " + sUser + " sobre el objeto " + sObjeto + "?",Exclamation!,YesNo!,2) = 1 THEN
  EXECUTE IMMEDIATE :sKILL ; // Se ejecuta la cadena.
END IF

dw_1.Retrieve()


Y ya está. :)

Cuando se quiera matar un proceso, se selecciona la fila, y se da al botón. Aparece un mensaje de confirmación, y el proceso bloqueado desaparecerá.


Hay que informar que todas estas operaciones tienen su peligro. Su uso debe ser exclusivo para alguien que sepa lo que está haciendo.
Un proceso bloqueado no es un mal proceso: puede que deba bloquear una tabla o registro un determinado tiempo mientras realiza una operación. Que el proceso esté bloqueado mucho (muchísimo) tiempo puede ser síntoma de que algo va mal, pero esta herramienta que hemos creado es para casos extremos en que queramos matar un proceso que se ha quedado perdido en el limbo de la Base de Datos. No debe usarse a discreción, porque podemos matar procesos realmente "vivos".

Usar con cuidado. ;)

No hay comentarios:

Publicar un comentario

Mi foto
Geek y Friki de amplio espectro pero de baja intensidad. Bloguero, forero y jugón online. Y Papá. Cada vez con menos tiempo para los hobbies.
Experto en PowerBuilder.
¿Te ha gustado? Haz un +1 en Google!

También te puede interesar...