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