【技巧】如何讓普通使用者可以殺掉自己使用者的會話
【技巧】如何讓普通使用者可以殺掉自己使用者的會話
1 BLOG文件結構圖
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的會話。
About Me
............................................................................................................................... ● 本文作者:小麥苗,只專注於資料庫的技術,更注重技術的運用 ● 本文在itpub(http://blog.itpub.net/26736162)、部落格園(http://www.cnblogs.com/lhrbest)和個人微信公眾號()上有同步更新 ● 本文itpub地址:http://blog.itpub.net/26736162/viewspace-2124932/ ● 本文部落格園地址:http://www.cnblogs.com/lhrbest/p/5869495.html ● 本文pdf版: (提取碼:ed9b) ● 小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/ ● QQ群:230161599 微信群:私聊 ● 聯絡我請加QQ好友(642808185),註明新增緣由 ● 於 2016-09-13 10:00~ 2016-09-13 11:20 在中行完成 ● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解! ● 【版權所有,文章允許轉載,但須以連結方式註明源地址,否則追究法律責任】 ............................................................................................................................... 手機長按下圖識別二維碼或微信客戶端掃描下邊的二維碼來關注小麥苗的微信公眾號:xiaomaimiaolhr,免費學習最實用的資料庫技術。 |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2124932/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- RAC可以殺掉其他例項上的會話會話
- 11gRAC可以殺掉其他例項上的會話會話
- MySQL:Innodb如何快速殺掉堵塞會話的思考MySql會話
- 如何殺掉一個使用者下的所有程式並drop掉這個使用者
- 【DB筆試面試185】在Oracle中,如何讓普通使用者可以TRUNCATE其他使用者的表?筆試面試Oracle
- 怎麼殺掉特定的資料庫會話資料庫會話
- 如何讓普通使用者也用上 Laravel-admin 。。Laravel
- 如何讓普通使用者可以對DBA_SOURCE檢視進行閃回查詢?
- 如何殺掉Teradata的sessionSession
- 如何在Linux 讓Telnet root使用者可以登入Linux
- PHP 會話(Session)如何實現使用者登陸功能PHP會話Session
- ubuntu 14.04 使用者如何安裝 SteamOS 會話Ubuntu會話
- securecrt保持會話不會斷掉Securecrt會話
- 請教:使用者會話的擺放位置會話
- 好的程式碼可以自己說話!
- Windows檢視登入使用者會話Windows會話
- oracle 10046其他使用者會話Oracle會話
- oracle 跟蹤當前使用者會話Oracle會話
- SAP ABAP Netweaver 裡的使用者會話概念會話
- ORACLE快速徹底Kill掉的會話Oracle會話
- 《使用者思維+:好產品讓使用者為自己尖叫》亞馬遜書評亞馬遜
- 易掉線、誤殺率高?使用者體驗這麼差,遊戲公司該如何最佳化?遊戲
- 自動殺掉堵塞別人超過2小時且自身是不活動的會話會話
- Linux如何殺掉殭屍程式Linux
- SUID 與 SGID - 使普通使用者可以完成特定使用者許可權才能完成的任務UI
- 《使用者思維+好產品讓使用者為自己尖叫》讀書總結
- SAP Commerce Cloud UI 的使用者會話管理CloudUI會話
- 讓Linux給一個普通使用者reboot許可權(轉)Linuxboot
- 如何在Linux中使用Shell指令碼終止使用者會話?Linux指令碼會話
- Runas命令:能讓域使用者/普通User使用者以管理員身份執行指定程式
- Linux中如何禁止普通使用者使用su命令Linux
- 【SQL_TRACE】解決普通使用者無法執行SQL_TRACE跟蹤其他會話問題SQL會話
- linux 禁止普通使用者su到root使用者Linux
- 別讓自己變為一個廢掉的程式猿
- 如何讓使用者喜歡你的網站?網站
- linux批量殺掉程式linux批量殺掉程式Linux
- 會話與 Cookie:使用者登入的原理是什麼?會話Cookie
- 批量kill殺死某些會話session的plsql會話SessionSQL