下面测试开发要求实现会话能KILL自己用户下的会话的功能,由于KILL SESSION默认只有DBA用户才有权限,并且如果授予alter system权限给用户,那么他可以KILL所有用户的会话,不能满足要求,并且alter system包含的权限太多,生产环境不敢授予这样的权限。
1 创建KILL SESSION存储过程
在创建存储过程之前,先确认存储是否存在,如果存在请更换名字
CREATE OR REPLACE PROCEDURE kill_session (pn_sid NUMBER, pn_serial NUMBER) AS lv_user VARCHAR2 (40); user_kill VARCHAR2 (40); BEGIN SELECT USER INTO user_kill FROM DUAL; SELECT username INTO lv_user FROM v$session WHERE sid = pn_sid AND serial# = pn_serial; IF lv_user IS NOT NULL AND lv_user = user_kill THEN EXECUTE IMMEDIATE 'alter system kill session ''' || pn_sid || ',' || pn_serial || ''''; ELSE raise_application_error ( -20000, 'Attempt to kill other session.'); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.put_line ('SESSION :' || pn_sid || ' IS NOT FIND;'); END; /
授予相应的权限
grant execute on kill_session to username; create public synonym kill_session for sys.kill_session; grant select on v_$session to username; grant execute on dbms_output to username; ser serveroutput on
2 KILL SESSION测试
任意输入SID,SERIAL,因为SID不存在,所以会报错 www.htz.pw > exec kill_session(1,1); SESSION :1 IS NOT FIND; PL/SQL procedure successfully completed. 会话2执行 www.htz.pw > conn htz/oracle Connected. 会话1执行 www.htz.pw > exec kill_session(148,70); PL/SQL procedure successfully completed. 回到会话2执行任意一条SQL语句,提示SESSION已经被KILL www.htz.pw > select * from dual; select * from dual * ERROR at line 1: ORA-00028: your session has been killed 下面是测试KILL其它用户的会话 会话2执行 www.htz.pw > conn htz1/oracle Connected. 会话1执行 ,这里会报KILL其它会话的提示。 www.htz.pw > exec kill_session(148,72); BEGIN kill_session(148,72); END; * ERROR at line 1: ORA-20000: Attempt to kill other session. ORA-06512: at "SYS.KILL_SESSION", line 19 ORA-06512: at line 1
kill my own session(without system privilege):等您坐沙发呢!