En el post de hoy, les quiero compartir un tip, que consideré importante, últimamente he tenido en las sesiones de soporte acceso a varias técnicas que utilizan los partners, clientes y administradores de bases de datos, cuando se refiere a remover actividad de usuario para Dynamics GP desde SQL Server.

Algunos abren la tabla Activity seleccionan el registro, dan click botón derecho sobre la línea y seleccionan borrar.

Otros simplemente deciden escribir el código:

Delete from Activity where userid = 'XXXX'

Pero analicemos, realmente no están removiendo la actividad del usuario no valido, lo que están haciendo solamente es remover el registro de la tabla de actividad para que GP no la vea desde ahí, pero que pasa si el usuario que remueven es erróneo, que pasa si existen 2 conexiones a la base de datos 1 para la compañía A y otra para la compañía B, la sesión de la compañía A es la no valida, pero el usuario se equivoca y elimina la sesión de la compañía B?

Además que pasaría si al eliminar una sesión no valida esta dejo procesos inconclusos en el sistema? O si tal vez dejo algunos registros bloqueados?

Mensajes como “El documento seleccionado está siendo editado por otro usuario” les suena familiar?

Yo tengo algunos años utilizando este código que les voy a proporcionar, y he visto como muchos otros te recomiendan soluciones similares, pero yo te explico cómo funciona.

SQL server mantiene un registro de las sesiones activas en la tabla SYSPROCESSES de la base MASTER dentro de SYSPROCESSES existe la columna login name, y nos basamos en las conexiones de SYSPROCESSES para limpiar la tabla ACTIVITY de la base DYNAMICS.

Una vez hecho esto, la tabla ACTIVITY se encuentra lista, ahora procedemos a la base de datos TEMP en especifico a la tabla DEX_SESSION, y comparamos el campo de sesión contra el numero de sesión en la tabla ACTIVITY, así mismo realizamos la misma comparación en la tabla DEX_LOCK para eliminar los registros bloqueados por alguna sesión no valida.

El siguiente paso es comparar los registros de ACTIVITY contra las tablas SY00800 y SY00801 para eliminar los registros de actividad en lotes y actividad de recursos respectivamente.

Aquí les proporciono el código:

delete from DYNAMICS..ACTIVITY 
    where USERID not in
        (select loginame from master..sysprocesses) 
delete from tempdb..DEX_SESSION 
    where session_id not in 
        (select SQLSESID from DYNAMICS..ACTIVITY) 
delete from tempdb..DEX_LOCK 
    where session_id not in 
        (select SQLSESID from DYNAMICS..ACTIVITY) 
delete from DYNAMICS..SY00800 
    where USERID not in 
        (select USERID from DYNAMICS..ACTIVITY) 
delete from DYNAMICS..SY00801 
    where USERID not in 
        (select USERID from DYNAMICS..ACTIVITY)

Nota: Asegúrate de tener un respaldo de tus bases de datos antes de ejecutar scripts que puedan modificar tus datos.

También te adjunto los KB donde muestran como remover registros de la DEX_SESSION así como la DEX_LOCK, mismos que en combinación crean el script que les proporciono.

A batch is held in the Posting, Receiving, Busy, Marked, Locked, or Edited status in Microsoft Dynamics GP (KB 850289) clip_image001

How to remove all the inactive sessions from the DEX_LOCK table in the TempDB database when you use Microsoft Dynamics GP together with Microsoft SQL Server (KB 864411) clip_image001[1]

How to remove all the inactive sessions from the DEX_SESSION table in the TempDB database when you use Microsoft Dynamics GP together with Microsoft SQL Server (KB 864413) clip_image001[2]

Hasta el próximo post!!!!