Alter system yetkisi olmayan kullanıcıların session kill edebilmelerinin sağlanması
Uygulama geliştiriciler , çoğunlukla uzun süren yada sorun olduğu düşündükleri oturumları kill etmek isterler. Fakat uygulama geliştiricilerin ALTER SYSTEM yetkisi olmadığından session kill komutunu çalıştıramazlar . Ayrıca bu yetkinin dba olmayan kullanıcılara verilmesi de tehlikelidir ve verilmemelidir.
Hem yetki vermeyelim hem de session kill edebilsin istediğimizde çözüm, oturumları kill eden bir prosedür yazıp bu prosedür için ilgili kullanıcıya execute yetkisi vermektir.
Aşağıdaki prosedürü SYS kullanıcısı altında oluşturup, ilgili kullanıcıya execute hakkı verdiğinizde , o kullanıcı da alter system olmadan session’ları sonlandırma yetkisine sahip olacaktır.
Gerekli prosedür :
CREATE OR REPLACE PROCEDURE kill_session(prm_sid NUMBER, prm_inst_id NUMBER DEFAULT 1) AS l_user VARCHAR2(30); l_serial NUMBER; l_inst_id NUMBER; BEGIN SELECT t.username, t.SERIAL#, t.INST_ID INTO l_user, l_serial, l_inst_id FROM gv$session t WHERE t.sid = prm_sid AND t.INST_ID = prm_inst_id; IF l_user IS NOT NULL AND l_user NOT IN ('SYS', 'SYSTEM') THEN EXECUTE IMMEDIATE 'alter system kill session ''' || prm_sid || ',' || l_serial || ',@' || prm_inst_id || ''''; dbms_output.put_line(prm_sid || ' idli session kill edildi.'); ELSE raise_application_error(-20000, 'Sistem session''ı kill edilemez'); END IF; END; /
Gerekli Yetkilendirme :
grant execute on kill_session to KULLANICI;