正常的kill session ,在DM中需要使用sysdba用执行sp_close_session(session_id)
普通用户如何进行这种操作呢?
大致有以下思路:
create PROCEDURE kill_session(session_id bigint) as BEGIN
sp_close_session(session_id);
end;
这种做法不足之处,拥有kill_session执行权限的用户可以kill所有用户的session,权限过大;
改进思路,如果不是当前用户自己的session则无法kill(感谢@气可鼓不可泄 提供建议)
最终版为:
--sysdba创建kill_session
CREATE OR REPLACE PROCEDURE kill_session(session_id bigint)
IS
sessid_count INT;
e2 EXCEPTION;
pragma exception_init (e2,-20096);
BEGIN
-- 需要增加对用户的判断
SELECT COUNT(1)
INTO
sessid_count
FROM v$sessions
WHERE sess_id=session_id
AND user_name=USER;
IF sessid_count=1 THEN
sp_close_session(session_id);
ELSE
raise e2;
END IF;
EXCEPTION
WHEN e2 THEN
PRINT SQLCODE||': SESS_ID('||session_id||') DOES NOT EXISTS, OR THE SESSION USER IS NOT'||USER;
END;
/
--给普通用户授权
grant exec on kill_session to u1;
--普通用户登录后进行kill session操作,117798928为session_id
sysdba.kill_session(117798928);
文章
阅读量
获赞