zoukankan      html  css  js  c++  java
  • 【技巧】如何让普通用户可以杀掉自己用户的会话

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

     

    1  BLOG文档结构图

    wps6BA9.tmp 

     

    2  前言部分

     

    2.1  导读和注意事项

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

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

     

      Tips

    本文在itpubhttp://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的最大归档日志号为33thread 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的更多内容可以参考我的bloghttp://blog.itpub.net/26736162/viewspace-2121019http://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 ;--假设上一步查询出来的SID1008,实例号为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的会话。

     

      About Me

    ...............................................................................................................................

    本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

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

    本文itpub地址:http://blog.itpub.net/26736162/viewspace-2124932/

    本文博客园地址:http://www.cnblogs.com/lhrbest/p/5869495.html

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

    小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/

    ● QQ群:230161599     微信群:私聊

    联系我请加QQ好友(642808185),注明添加缘由

    2016-09-13 10:00~ 2016-09-13 11:20 在中行完成

    文章内容来源于小麦苗的学习笔记部分整理自网络,若有侵权或不当之处还请谅解!

    【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】

    ...............................................................................................................................

    手机长按下图识别二维码或微信客户端扫描下边的二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,免费学习最实用的数据库技术。

    wps6BBA.tmp

     

  • 相关阅读:
    GTest交流与经验总结
    linux i2c驱动架构-dm368 i2c驱动分析
    在不同编译环境中如何使用sleep()函数
    Android应用之基本的组件(一)
    Java Arrays Tutorial (3)
    ASP.NET中操作SQL数据库
    安卓开发06:布局-线性布局 LinearLayout
    在开发 ExtJS 应用程序常犯的 10 个错误
    每天4个linux命令--步骤一
    获取CPU序列号
  • 原文地址:https://www.cnblogs.com/lhrbest/p/5869495.html
Copyright © 2011-2022 走看看