lunes, 8 de junio de 2015

dbando Trigger que mata sesiones atrapadas

Buen dia,


El siguiente Trigger mata sesiones de usuarios atrapadas, lo hace de manera automatica, esto en caso de que nuestra solucion al perder conexion por lluvia, apagones, etc no pueda matar las sesiones en automatico, y si tenemos reestriccion en el numero de sesiones por usuario, este Trigger nos ayudara mucho.

El codigo es el siguiente:


CREATE OR REPLACE TRIGGER KILL_SESSIONS_LETG
AFTER LOGON ON DATABASE
DECLARE

--Declaracion de variables

  t_prog sys.v_$session.program%TYPE;
  v_numsid integer;
  v_sid sys.v_$session.sid%TYPE;
  v_serial sys.v_$session.serial#%TYPE;
  sidd integer;
  seriall integer;
  sid2 integer;
  serial2 integer;
  v_user varchar2(20);
    
BEGIN

--Se evita el error comun de procesos background de oracle

  SELECT count(PROGRAM)
  into t_prog
  from sys.v_$session
  where program like 'oracle@osgc-oracle (J00%)'
  AND audsid = USERENV('SESSIONID')
  AND  ROWNUM = 1;
  
  IF t_prog >0
  
  THEN
  
  NULL;
    
  ELSE
  
  --Se obtiene el usuario del sesion actual
  
  SELECT username,sid,serial#
  INTO v_user,v_sid,v_serial
  FROM sys.v_$session
  WHERE  audsid = USERENV('SESSIONID')
  AND  audsid != 0 
  AND  ROWNUM = 1;  
  
 --Se generan los usuarios que no se veran afectados por el trigger

     IF UPPER(v_user)='ADMON' OR
     UPPER(v_user)='BATCH' OR
     UPPER(v_user)='CESFI2014' OR
     UPPER(v_user)='PERRITO'
  
  THEN
NULL;

ELSE

--Se estima el valor maximo de conexiones a la base de datos
--en general este trigger es para soluciones donde las sesiones 
--quedan atrapadas y es necesario desconectar usuarios

 select count(sid)
 into v_numsid
 from v$session
 where username=v_user
 and program like 'opensgc%';

 IF v_numsid >2
  
 THEN

 --Hacemos la comparacion para no matar nuestra sesion actual
  select sid,serial#
  into sidd,seriall
  from v$session
  where username=v_user 
  and sid != v_sid
  AND serial# != v_serial
  and program like 'programa_con_el_que_nos_conectamos%'
  and rownum=1;
  
  --EXECUTE IMMEDIATE 'alter system kill session ''' || sidd || ',' || seriall || '''';
  EXECUTE IMMEDIATE 'alter system disconnect session ''' || sidd || ',' || seriall || '''immediate';
  
  
  --Hacemos la comparacion para no matar nuestra sesion actual
  select sid,serial#
  into sid2,serial2
  from v$session
  where username=v_user 
  and sid != v_sid
  AND serial# != v_serial
  and program like 'programa_con_el_que_nos_conectamos2%'
  and rownum=1;
  
  --EXECUTE IMMEDIATE 'alter system kill session ''' || sidd || ',' || seriall || '''';
  EXECUTE IMMEDIATE 'alter system disconnect session ''' || sidd || ',' || seriall || '''immediate';
  
  ELSE

 NULL;

END IF;
 END IF;
  END IF;
END;
/



Saludos!!

No hay comentarios:

Publicar un comentario