อยากฆ่าคน เอ้ย session บน oracle แต่ไม่มีสิทธิ์ (Privilege) ไปขอสิทธิ์ DBA แล้ว DBA บอกว่าไม่มีสิทธิ์ kill session จะแจกให้!!! ทำไงดี
เข้าระบบฐานข้อมูล Oracle ด้วยผู้ใช้ system หรือ sys แล้วสร้าง Procedure ชื่อว่า sp_kill_dev_session ด้วยคำสั่ง
CREATE OR REPLACE PROCEDURE sys.sp_kill_dev_session(p_sid NUMBER, p_serial NUMBER)
AS
v_user VARCHAR2(30);
BEGIN
SELECT MAX(username)
INTO v_user
FROM v$session
WHERE sid = p_sid
AND serial# = p_serial;
IF v_user IN ('SCOTT') THEN --the list can be extended
EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' || p_sid || ',' || p_serial || '''';
ELSIF v_user IS NULL THEN
RAISE_APPLICATION_ERROR(-20001,'Session has Expired or Invalid sid/serial Arguments Passed');
ELSE
RAISE_APPLICATION_ERROR(-20002,'Unauthorized Attempt to Kill a Non-Dev Session has been Blocked.');
END IF;
END sp_kill_dev_session;
/
จาก code ข้างต้น ให้เปลี่ยน SCOTT เป็น username ที่เป็นเจ้าของ session เช่น
IF v_user IN ('HIRXPXT','PHU_XDMIHHION') THEN --the list can be extended
เป็นต้น จากตัวอย่าง จะมี 2 user คือ HIRXPXT และ PHU_XDMIHHION
แล้ว grant สิทธิ์ ให้สามารถ exec กับ user ที่ต้องการฆ่า session เหล่านั้นด้วยคำสั่ง ตัวอย่างจะให้ user ชื่อว่า HIRXPXT มีสิทธิ์ exec
GRANT EXECUTE ON sp_kill_dev_session TO HIRXPXT;
แล้วจะทำให้ user ที่ชื่อ HIRXPXT สามารถฆ่า (kill) session ของ user ได้ 2 คนคือ HIRXPXT และ PHU_XDMIHHION
วิธีใช้งาน เข้าระบบด้วย user ที่ชื่อ HIRXPXT แล้วเรียกใช้คำสั่ง
exec sys.sp_kill_dev_session(sid,serial num);
เช่น
exec sys.sp_kill_dev_session(154,42802);
โดย 14 คือ sid และ 26043 คือ serial ซึ่งสองค่านี้สามารถเรียกดูได้จากคำสั่ง
SELECT SID, SERIAL#, STATUS, SERVER
FROM V$SESSION
WHERE USERNAME = upper('<username>');
เปลี่ยน <username> เป็น username ที่ต้องการ แต่การที่จะดูค่าเหล่านี้ได้ต้องมีสิทธิ์ จากตัวอย่าง user ที่ชื่อ HIRXPXT สามารถ select view และ table เหล่านี้ได้
SYS.V_$PROCESS
SYS.V_$SESSION
SYS.V_$TRANSACTION
SYS.V_$SESSION_LONGOPS
SYS.V_$LOCK
SYS.V_$SESSTAT
SYS.V_$STATNAME
SYS.V_$ACCESS
SYS.V_$ROLLNAME
SYS.V_$SQLTEXT
SYS.V_$SQLTEXT_WITH_NEWLINES
SYS.V_$SQL
SYS.V_$OPEN_CURSOR
SYS.V_$SESSION_WAIT
SYS.V_$SESSION_EVENT
SYS.V_$SESSION_CONNECT_INFO
SYS.V_$EVENT_NAME
SYS.V_$SESS_IO
SYS.V_$EVENTMETRIC
SYS.DBA_ROLLBACK_SEGS
เท่านี้ก็เพียงพอที่จะให้ทีมพัฒนาสามารถฆ่า (kill) session ของตัวเองที่ค้างอยู่บน server ได้โดยไม่ต้องมาจิกหัว DBA กรั่กๆ
ต้นฉบับ
จบ…. ขอให้สนุก