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 oracle_br%40yahoogrupos.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 9.2.0.8.0 - Production
CORE 9.2.0.8.0 Production
TNS