Eliminar Conexiones Inactivas
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
Desde ya muchas gracias
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
(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