Grande Chiappa.
Sim... Depois de postado a mensagem que percebi que nenhum "evento" poderia
ser detectado pelo banco nestas condições... E acabei montando uma procedure
(disparada por job) que faz essa validação que precisava a cada x minutos...
Como notamos que essas sessões que estavam "órfãs" no banco apareciam com os
campos machine e terminal como "null", ficou mais simples de filtrá-las no
banco...
Vou postar aqui tb pois pode ser útil pra alguns do grupo...
##
CREATE TABLE SessoesMortas
(SqlAtualVARCHAR2(1000),
ValorSIDVARCHAR2(30),
ValorSerial#VARCHAR2(30),
ValorSPID VARCHAR2(30),
ValorUsername VARCHAR2(30),
ValorProgramVARCHAR2(100),
ValorOSUser VARCHAR2 (30),
ValorMachineVARCHAR2 (30),
ValorTerminal VARCHAR2 (30),
ValorLogonTime DATE,
HoraObito DATE
);
CREATE OR REPLACE PROCEDURE finaliza_sessoes_inativas
IS
ComandoKill VARCHAR2(200);
SqlAtualVARCHAR2(1000);
ValorSID VARCHAR2(30);
ValorSerial# VARCHAR2(30);
ValorSPIDVARCHAR2(30);
ValorUsername VARCHAR2(30);
ValorProgram VARCHAR2(100);
ValorOSUserVARCHAR2 (30);
ValorMachineVARCHAR2 (30);
ValorTerminalVARCHAR2 (30);
ValorLogonTimeDATE;
CURSOR testa_condicao IS
select s.sid, s.serial#, s.username, s.program, s.osuser, s.machine,
s.terminal, t.sql_text, p.spid, s.logon_time
from v$session s, v$sql t, v$process p
where s.username like 'DBA%'
and s.status in ('ACTIVE','INACTIVE','KILLED')
and s.machine is null
and s.terminal is null
and t.address=s.sql_address
and s.paddr=p.addr;
BEGIN
FOR sessao in testa_condicao
LOOP
SqlAtual := sessao.sql_text;
ValorSID := sessao.sid;
ValorSerial# := sessao.serial#;
ValorSPID := sessao.spid;
ValorUsername := sessao.username;
ValorProgram := sessao.program;
ValorOSUser := sessao.osuser;
ValorMachine := sessao.machine;
ValorTerminal := sessao.terminal;
ValorLogonTime := sessao.logon_time;
ComandoKill:= 'ALTER SYSTEM KILL SESSION ''' || ValorSID ||
',' || ValorSerial# || ''' IMMEDIATE';
Execute Immediate(ComandoKill);
Insert Into SessoesMortas
Values
(SqlAtual, ValorSID, ValorSerial#, ValorSPID, ValorUsername,
ValorProgram, ValorOSUser, ValorMachine, ValorTerminal, ValorLogonTime,
sysdate);
END LOOP;
Commit;
END;
/
##
Em 02/06/07, jlchiappa <[EMAIL PROTECTED]> escreveu:
>
> Gustavo, "trigger" eu acho que não faz sentido, pois triggers
> respondem a eventos, e vc NÃO ESTÁ falando de desconexão graciosa, e
> sim está falando de programa ABORTADO, absolutamente FORA DE CONTROLE
> por parte do banco, qual evento vc acga que poderia disparar aí ???
> O que vc poderia fazer é via config de sql*net estabelecer um DCD
> (dead cliente detection) , OU via profile vc estabelecer tempo máximo
> de inatividade OU ter um job (job Oracle ou job de So, como preferir,
> embora job Oracle seja mais fácil de administrar neste caso), job que
> a cada X minutos é disparado e procurar por sessões "mortas" - só
> LEMBRANDO que em sendo conexão dedicada vc tem um PROCESSO SHADOW
> atendendo à conexão, NEM SEMPRE quando uma sessão de cliente morre o
> processo morre junto, vc TERIA que consultar v$session, v$process, E
> teria que verificar se no SO o processo realmente existe...
> Agora, cliente morrendo constantemente IMPLICA qe vc tem sim algum
> bug sério aí, aplicação, rede, hardware, etc , TEM QUE serem
> rigorosamente checadas pra vc descobrir ONDE o prob reside...
>
> []s
>
> Chiappa
> --- Em oracle_br@yahoogrupos.com.br ,
> "Gustavo Venturini de Lima"
> <[EMAIL PROTECTED]> escreveu
>
> >
> > Boa noite pessoal...
> > Sei que já passaram algumas mensagens com este assunto por aqui, mas não
> > consegui achar alguma nos meus "históricos" que possam me ajudar
> muito...
> > Estou tendo o seguinte problema: Algumas sessões de usuários (jobs
> locais)
> > estão travando e suas sessões (do aplicativo) morrem... Porém, a
> sessão no
> > banco continua a existir, e em algum casos processando...
> > Pensei em fazer fazer algo como uma trigger que validasse o campo
> "machine"
> > da v$session, e quando for nulo (não sendo usuário oracle é claro),
> e com o
> > owner da aplicação ele "limpar" esta sessão. É possível isso? Alguém tem
> > alguma outra sugestão ou pode exemplificar esta que dei???
> >
> > HP-UX myserver B.11.23 U ia64 2052350653 unlimited-user license
> >
> > BANNER
> > --
> > Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
> > PL/SQL Release