设为首页 - 加入收藏 - 网站地图 SecYe安全 Www.SecYe.Com - 国内网络信息安全IT技术门户网
当前位置:SecYe > 数据库 > Oracle > 正文

【技巧】如何让普通用户可以杀掉自己用户的会话

时间:2016-09-20 09:05 来源:ITPUB 作者:lhrbest 阅读:

1 BLOG文档结构图

wps6BA9.tmp

 

2 前言部分

 

2.1 导读和注意事项

各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:

① 如何让普通用户可以杀掉自己用户的会话(重点)

 

Tips:

① 本文在itpub(http://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和微信公众号(xiaomaimiaolhr)有同步更新。

② 文章中用到的所有代码,相关软件,相关资料请前往小麦苗的云盘下载(http://blog.itpub.net/26736162/viewspace-1624453/)。

③ 若网页文章代码格式有错乱,推荐使用360浏览器,也可以下载pdf格式的文档来查看,pdf文档下载地址:http://blog.itpub.net/26736162/viewspace-1624453/,另外itpub格式显示有问题,也可以去博客园地址阅读。

④ 本篇BLOG中命令的输出部分需要特别关注的地方我都用灰色背景和粉红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33,thread 2的最大归档日志号为43是需要特别关注的地方;而命令一般使用黄色背景和红色字体标注;对代码或代码输出部分的注释一般采用蓝色字体表示。

List of Archived Logs in backup set 11

Thrd Seq Low SCN Low Time Next SCN Next Time

---- ------- ---------- ------------------- ---------- ---------

1 32 1621589 2015-05-29 11:09:52 1625242 2015-05-29 11:15:48

1 33 1625242 2015-05-29 11:15:48 1625293 2015-05-29 11:15:58

2 42 1613951 2015-05-29 10:41:18 1625245 2015-05-29 11:15:49

2 43 1625245 2015-05-29 11:15:49 1625253 2015-05-29 11:15:53

[ZHLHRDB1:root]:/>lsvg -o

T_XLHRD_APP1_vg

rootvg

[ZHLHRDB1:root]:/>

00:27:22 SQL> alter tablespace idxtbs read write;

====》2097152*512/1024/1024/1024=1G

 

本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。

 

2.2 相关参考文章链接

&说明:

有关kill session的更多内容可以参考我的blog:http://blog.itpub.net/26736162/viewspace-2121019和http://blog.itpub.net/26736162/viewspace-2121020

 

2.3 本文简介

普通用户想要杀掉会话必须要有ALTER SYSTEM的权限,但是该权限过大,用户可能使用该权限错杀其它用户的会话,所以,有没有其它办法可以实现该功能呢?该类问题也是DBA中常遇到的问题,下边作者给出一种解决方案。

首先,可以创建一个查询自己会话信息的视图,将该视图创建公共同义词,然后创建一个存储过程,该存储过程实现杀会话的需要,最后将该存储过程赋权给PUBLIC即可解决这个问题。

【这也是小麦苗即将出版的书中的一个小小节,提前分享给大家,o(∩_∩)o ,希望大家到时候多多捧场。】

3 代码分享

代码实现过程如下:

 

CREATE OR REPLACE VIEW VW_MYOWNERSESSION_LHR

AS

SELECT * FROM V$SESSION WHERE USERNAME = USER;

 

CREATE OR REPLACE PUBLIC SYNONYM SYN_MYOWNERSESSION_LHR FOR SYS.VW_MYOWNERSESSION_LHR;

 

CREATE OR REPLACE PROCEDURE PRO_KILL_MYOWN_SESSION_LHR(P_INST IN NUMBER,

P_SID IN NUMBER,

P_SERIAL# IN NUMBER) IS

V_IGNORE PLS_INTEGER;

V_VERSION VARCHAR2(10);

V_INST_ID NUMBER;

BEGIN

SELECT COUNT(*)

INTO V_IGNORE

FROM GV$SESSION D

WHERE USERNAME = USER

AND SID = P_SID

AND SERIAL# = P_SERIAL#

AND D.INST_ID = P_INST;

 

SELECT SUBSTR(V.VERSION, 1, INSTR(V.VERSION, '.') - 1), V.INSTANCE_NUMBER

INTO V_VERSION, V_INST_ID

FROM V$INSTANCE V;

 

IF (V_IGNORE = 1) THEN

 

IF (V_VERSION = '10' AND V_INST_ID <> P_INST) THEN

RAISE_APPLICATION_ERROR(-20001,

'Please connect to 【INSTANCE:' || P_INST ||

'】,then retry!');

ELSIF (V_VERSION = '10' AND V_INST_ID = P_INST) THEN

EXECUTE IMMEDIATE 'ALTER SYSTEM DISCONNECT SESSION ''' || P_SID || ',' ||

P_SERIAL# || ''' IMMEDIATE';

 

ELSE

EXECUTE IMMEDIATE 'ALTER SYSTEM DISCONNECT SESSION ''' || P_SID || ',' ||

P_SERIAL# || ',@' || P_INST || ''' IMMEDIATE';

END IF;

 

ELSE

RAISE_APPLICATION_ERROR(-20002,

'You do not own session ''' || P_SID || ',' ||

P_SERIAL# ||',@' || P_INST || '''');

END IF;

END PRO_KILL_MYOWN_SESSION_LHR;

/

 

CREATE OR REPLACE PUBLIC SYNONYM PRO_KILL_SESSION_LHR FOR SYS.PRO_KILL_MYOWN_SESSION_LHR;

 

GRANT SELECT ON SYN_MYOWNERSESSION_LHR TO PUBLIC;

GRANT EXECUTE ON PRO_KILL_SESSION_LHR TO PUBLIC;

 

 

使用方法:

SELECT USERENV('INSTANCE'),USERENV('SID') FROM DUAL;

SELECT V.INST_ID, SID,SERIAL#,PADDR,STATUS FROM SYN_MYOWNERSESSION_LHR V WHERE SID=1008 AND V.INST_ID=1 ;--假设上一步查询出来的SID为1008,实例号为1

EXEC PRO_KILL_SESSION_LHR(1,1008,35038);--假设上一步查询出来的SERIAL#为35038

 

 

 

3.1 代码演示

3.1.1 使用SYS用户杀PMON进程的会话

SYS@lhrdb21> SELECT A.SID,A.SERIAL#,USERENV('INSTANCE'),USERNAME FROM v$session a WHERE a.PROGRAM LIKE '%PMON%';

 

SID SERIAL# USERENV('INSTANCE') USERNAME

---------- ---------- ------------------- ------------------------------

125 1 1

 

SYS@lhrdb21> EXEC PRO_KILL_SESSION_LHR(1,125,1);

BEGIN PRO_KILL_SESSION_LHR(1,125,1); END;

 

*

ERROR at line 1:

ORA-20002: You do not own session '125,1,@1'

ORA-06512: at "SYS.PRO_KILL_MYOWN_SESSION_LHR", line 36

ORA-06512: at line 1

 

由于系统进程的用户名为空,所以避免了误杀系统进程。

3.1.2 使用SYS用户杀普通用户的会话

SYS@lhrdb21> SELECT A.SID,A.SERIAL#,USERENV('INSTANCE'),USERNAME FROM v$session a WHERE username='LHR';

 

SID SERIAL# USERENV('INSTANCE') USERNAME

---------- ---------- ------------------- ------------------------------

79 16453 1 LHR

 

SYS@lhrdb21> EXEC PRO_KILL_SESSION_LHR(1,79,16453);

BEGIN PRO_KILL_SESSION_LHR(1,79,16453); END;

 

*

ERROR at line 1:

ORA-20002: You do not own session '79,16453,@1'

ORA-06512: at "SYS.PRO_KILL_MYOWN_SESSION_LHR", line 36

ORA-06512: at line 1

SYS@lhrdb21> conn lhr/lhr

Connected.

LHR@lhrdb21> EXEC PRO_KILL_SESSION_LHR(1,79,16453);

 

PL/SQL procedure successfully completed.

 

由于79会话属于LHR用户,所以避免了误杀其它用户的会话,当使用LHR用户的时候可以正常杀会话。

3.1.3 使用LHR用户杀其它用户的会话

LHR@lhrdb21> SELECT A.SID,A.SERIAL#,USERENV('INSTANCE'),USERNAME FROM v$session a WHERE username='LHRTEST';

 

SID SERIAL# USERENV('INSTANCE') USERNAME

---------- ---------- ------------------- ------------------------------

142 12947 1 LHRTEST

 

LHR@lhrdb21> EXEC PRO_KILL_SESSION_LHR(1,142,12947);

BEGIN PRO_KILL_SESSION_LHR(1,142,12947); END;

 

*

ERROR at line 1:

ORA-20002: You do not own session '142,12947,@1'

ORA-06512: at "SYS.PRO_KILL_MYOWN_SESSION_LHR", line 36

ORA-06512: at line 1

 

普通用户LHR也不能杀掉其它用户LHRTEST的会话。

 

本文pdf版:http://yunpan.cn/cdEQedhCs2kFz (提取码:ed9b)

本文来源:SecYe安全网[http://www.secye.com] (责任编辑:SecYe安全)

点击复制链接 与好友分享!

顶一下
(0)
0%
踩一下
(0)
0%
推荐内容