当前位置: 首页 > BASIC > 正文

        下面测试开发要求实现会话能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):等您坐沙发呢!

发表评论

gravatar

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen

快捷键:Ctrl+Enter