Dozvola za ubijanje (sesija)

Thursday, 11.03.2010 – Dejan

Ne proÄ‘e skoro nijedan dan, a da me barem jedan programer ne gnjavi da mu ubijem zablokiranu sesiju. PoÅ¡to nemam baÅ¡ vremena da se cimam i oko toga, odluÄio sam da svakom programeru dozvolim ubijanje vlastitih sesija.

Takođe ne volim otkrivati toplu vodu, pa sam za ovaj problem malo proguglao i našao sasvim zadovoljavajuće rješenje od Toma Kyte-a, a ono izgleda ovako:

1. svakom programeru dodijeliti privilegiju, da može selektovati potrebne podatke iz v_$session (sid, serial#):

grant select on v_$session to programer;

2. Ako već nemate nekog “poweruser” korisnika (“non-SYS user with a DBA role“), onda kreirajte jednog, pa s tim korisniÄkim nalogom kreirajte jednu proceduru, koja će ubijati željenu sesiju:

create or replace procedure poweruser.kill_session( p_sid     in number,
                                                    p_serial# in number)
  is
      ignore          pls_integer;
  BEGIN
      select count(*) into ignore
        from V$session
       where username = USER
         and sid = p_sid
         and serial# = p_serial#;

      if ( ignore = 1 )
      then
          execute immediate '
              alter system kill session ''' ||
              to_char(p_sid,'999999')||','||
              to_char(p_serial#,'999999')||'''';
      else
          raise_application_error( -20001,
                                 'You do not own session ''' ||
                                  p_sid || ',' || p_serial# ||
                                 '''' );
      end if;
  END;
  /

3. dozvolite izvršavanje te procedure svim programerima:

grant execute on kill_session to programer;

To je to – nema viÅ¡e svakodnevnog cimanja u vezi ubijanja sesija.

  1. One Response to “Dozvola za ubijanje (sesija)”

  2. I ja sam uradio neÅ¡to sliÄno. Za razliku od tvog reÅ¡enja, dodao sam informaciju o aplikaciji u client_info polje u v$session. Aplikacije sam napravio tako da na poÄetku setuju client_info, pa kod sledećeg ulaska u aplikaciju, ako postoji proces koji ima odgovarajući podatak u client_info, sistem nudi da se ubije prethodno napravljeni proces.

    By Djordje on Mar 11, 2010

Post a Comment