Se puede poner un límite en el tiempo inactivo y continuo de una sesión de la manera siguiente. Antes de empezar, es necesario cambiar resource_limit a true. Si no se hace esto, los límites no se hacen cumplir:
SQL> alter system set resource_limit = true
2 /
Sistema modificado.
SQL>
SQL> create profile idle_time_profile
Luego debes crear un perfil con un límite en el tiempo de inactividad que se llama idle_time. El valor que empleas es en minutos:
SQL> create profile idle_time_profile
2 limit idle_time 1
3 /
Perfil creado.
SQL>
SQL> create user idle_time_user
Entonces necesitas un usuario para probar el perfil. Se puede crearlo así:
SQL> create user idle_time_user
2 identified by idle_time_user
3 profile idle_time_profile
4 /
Usuario creado.
SQL> grant create session to idle_time_user
2 /
Concesion terminada correctamente.
SQL>
Para probar el perfil, el usuario nuevo se conecta a la base de datos. Lo hago en rojo porque desde ahora tendré que trabajar en dos sesiónes distintas:
SQL> conn idle_time_user/idle_time_user
Conectado.
SQL>
Luego el usuario sys se conecta a la base de datos para monitorizar la sesión del usuario idle_time_user. Por eso, lo hago en azul en una sesión distinta. El usuario sys sabe que la sesión de idle_time_user no hace nada porque tiene un status de INACTIVE:
SQL> conn / as sysdba
Conectado.
SQL> select status from v$session
2 where username = 'IDLE_TIME_USER'
3 /
STATUS
--------
INACTIVE
SQL> exec dbms_lock.sleep(60);
Procedimiento PL/SQL terminado correctamente.
SQL>
Después de un minuto de inactividad, Oracle podría cerrar la sesión de idle_time_user pero no suele hacerlo inmediatamente:
SQL> select status from v$session
2 where username = 'IDLE_TIME_USER'
3 /
STATUS
--------
INACTIVE
SQL> exec dbms_lock.sleep(60);
Procedimiento PL/SQL terminado correctamente.
SQL>
Tras dos minutos, Oracle todavía no se da cuenta de la inactividad de idle_time_user:
SQL> select status from v$session
2 where username = 'IDLE_TIME_USER'
3 /
STATUS
--------
INACTIVE
SQL> exec dbms_lock.sleep(60);
Procedimiento PL/SQL terminado correctamente.
SQL>
Pero tras 3 minutos, Oracle se da cuenta y cambia el status de idle_time_user a SNIPED:
SQL> select status from v$session
2 where username = 'IDLE_TIME_USER'
3 /
STATUS
--------
SNIPED
SQL>
Y cuando idle_time_user vuelve a su sesión, Oracle le da un error ORA-02396 y le dice de conectarse otra vez a la base de datos antes de continuar:
SQL> select sysdate from dual;
select sysdate from dual
*
ERROR en linea 1:
ORA-02396: ha excedido el tiempo maximo de
inactividad, vuelva a conectarse
SQL>
No hay comentarios:
Publicar un comentario