Eliminar Conexiones Inactivas

bmgdba
07 de Diciembre del 2005
Hola a todos, alguien me podria indicar como puedo crear un procedimiento que me elimine las sesiones inactivas, o si oracle posee un time out para esto.

Desde ya muchas gracias

andrewsreid
07 de Diciembre del 2005
Aquí está un ejemplo de lo que quieres hacer:

(1) Para empezar, RESOURCE_LIMIT tiene que estar TRUE.
(2) Hay que crear un PROFILE. En el ejemplo, el PROFILE se llama FOR_ANDREW y tiene un límite de inactividad (IDLE_TIME) de 1 minuto. En la vida verdadera un límite de 5, 10 o 15 minutos sería normal.
(3) Luego hay que dar este PROFILE a un usuario. Se llama ANDREW en el ejemplo.
(4) El usuario hace un SELECT y entonces duerme durante 5 minutos.
(5) Cada 3 o 5 minutos Oracle busca a usuarios que tienen un tiempo de inactividad más que su IDLE_TIME permitido. Entonces Oracle cambia el STATUS de estos usuarios a SNIPED.
(6) Más tarde, cuando el usuario intenta hacer un SELECT, no está permitido y debe conectarse otra vez a la base de datos.

SQL> @profile
SQL> SPOOL PROFILE
SQL> SET ECHO ON
SQL> CONN / AS SYSDBA
Connected.
SQL> SHOW USER
USER is "SYS"
SQL> ALTER SYSTEM SET RESOURCE_LIMIT=TRUE
2 /

System altered.

SQL> CREATE PROFILE FOR_ANDREW LIMIT IDLE_TIME 1
2 /

Profile created.

SQL> CREATE USER ANDREW IDENTIFIED BY REID PROFILE FOR_ANDREW
2 /

User created.

SQL> GRANT CREATE SESSION TO ANDREW
2 /

Grant succeeded.

SQL> CONN ANDREW/REID
Connected.
SQL> SHOW USER
USER is "ANDREW"
SQL> SELECT TO_CHAR(SYSDATE,'HH24:MI:SS') TIME_NOW FROM DUAL
2 /

TIME_NOW
--------
17:54:39

SQL> !sleep 300

SQL> SELECT TO_CHAR(SYSDATE,'HH24:MI:SS') TIME_NOW FROM DUAL
2 /
SELECT TO_CHAR(SYSDATE,'HH24:MI:SS') TIME_NOW FROM DUAL
*
ERROR at line 1:
ORA-02396: exceeded maximum idle time, please connect again


SQL> CONN / AS SYSDBA
Connected.
SQL> SHOW USER
USER is "SYS"
SQL> DROP USER ANDREW CASCADE
2 /

User dropped.

SQL> DROP PROFILE FOR_ANDREW CASCADE
2 /

Profile dropped.

SQL> ALTER SYSTEM SET RESOURCE_LIMIT=FALSE
2 /

System altered.

SQL> SPOOL OFF

El problema es que éste es solamente una manera de mejorar la seguridad. El usuario permanece en V$SESSION con su STATUS de SNIPED. No desaparece hasta que intenta hacer el segundo SELECT:

SQL> l
1 select status, to_char(sysdate,'hh24:mi:ss') time_now
2 from v$session
3* where username = 'ANDREW'
SQL> /

STATUS TIME_NOW
-------- --------
INACTIVE 17:56:06

SQL> /

STATUS TIME_NOW
-------- --------
SNIPED 17:57:38