Re: [oracle_br] Re: Trigger com disconnect

2007-06-03 Por tôpico Gustavo Venturini de Lima
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 

[oracle_br] Re: Trigger com disconnect

2007-06-02 Por tôpico jlchiappa
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 9.2.0.8.0 - Production
 CORE9.2.0.8.0   Production
 TNS for HPUX: Version 9.2.0.8.0 - Production
 NLSRTL Version 9.2.0.8.0 - Production
 
 Abraços.
 
 
 [As partes desta mensagem que não continham texto foram removidas]