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