【技巧】如何讓普通使用者可以殺掉自己使用者的會話

lhrbest發表於2016-09-13

 技巧】如何讓普通使用者可以殺掉自己使用者的會話

 

 BLOG文件結構圖

wps6BA9.tmp 

 

 前言部分

 

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 ,希望大家到時候多多捧場。】

 程式碼分享

程式碼實現過程如下:

 

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:2在中行完成

● 文章內容來源於小麥苗的學習筆記部分整理自網路,若有侵權或不當之處還請諒解!

● 【版權所有,文章允許轉載,但須以連結方式註明源地址,否則追究法律責任】

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

手機長按下圖識別二維碼或微信客戶端掃描下邊的二維碼來關注小麥苗的微信公眾號:xiaomaimiaolhr,免費學習最實用的資料庫技術。

wps6BBA.tmp

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2124932/,如需轉載,請註明出處,否則將追究法律責任。

相關文章