【总结】不是DBA,想要KILL SESSION,还可以限制只KILL用户自己的SESSION。
2010-03-18 10:48 土星的狗狗 阅读(1808) 评论(0) 编辑 收藏 举报现在遇到的问题是之前有三个DBA用户,现在需要取消这个角色,其中一个问题就是他们需要用自己的用户KILL SESSION,但需求只是需要KILL自己的SESSION,为了这个需求,我对用户权限做出了如下调整:
grant select_catalog_role to user_name;
grant alter system to user_name;
这样可以快速的对应用户的需求,但因为ALTER SYSTEM本身就是一个很强大的权限,可以对数据库实例进行设置。Oracle不但没有控制KILL哪些会话的权限,连单独KILL SESSION的权限都不存在。
而对于这种权限没有办法解决的问题,最好的处理方法就是通过存储过程将功能封装起来,然后将过程授权给用户:
CREATE OR REPLACE PROCEDURE SYSTEM.P_KILL_USER_SESSION(P_SID IN NUMBER)
AUTHID CURRENT_USER AS
V_USERNAME VARCHAR2(30);
V_SID NUMBER;
BEGIN
SELECT SYS_CONTEXT('USERENV', 'SESSION_USER'),
SYS_CONTEXT('USERENV', 'SID')
INTO V_USERNAME, V_SID
FROM DUAL;
IF P_SID != V_SID THEN
SYSTEM.P_KILL_SESSION(V_USERNAME, P_SID);
ELSE
RAISE_APPLICATION_ERROR(-20000, 'CAN NOT KILL CURRENT SESSION!');
END IF;
END;
-----------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE P_KILL_SESSION(P_USER IN VARCHAR2,
P_SID IN VARCHAR2) AS
V_SQL VARCHAR2(32767);
BEGIN
SELECT 'ALTER SYSTEM KILL SESSION ''' || SID || ',' || SERIAL# || ''''
INTO V_SQL
FROM V$SESSION
WHERE USERNAME = P_USER
AND SID = P_SID;
EXECUTE IMMEDIATE V_SQL;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001,
'SID:' || P_SID ||
' DOES NOT EXISTS, OR THE SESSION USER IS NOT ' ||
P_USER);
END;
---------------------------------------------------------------------------------------
REVOKE alter system FROM user_name;
GRANT EXECUTE ON P_KILL_USER_SESSION TO user_name;
参考:http://space.itpub.net/?uid-4227-action-viewspace-itemid-580406