oracle的會話如何自殺?

zhang41082發表於2019-04-18

問題提出:
pub上有網友提出了一個會話如何自殺,因為一個會話是不能殺死自己的,如果直接執行alter system kill session 來殺死自己,則報錯如下:
SQL> select sid,serial# from v$session where sid in (select sid from v$mystat);

SID SERIAL#
---------- ----------
855 27

SQL> alter system kill session '855,27';
alter system kill session '855,27'
*
ERROR at line 1:
ORA-00027: cannot kill current session

[@more@]

那來看一下如何把kill session的任務扔給job,讓job充當另一個會話來殺掉自己:
CREATE OR REPLACE PROCEDURE PRC_KILLSELF(V_SID VARCHAR2, V_SERIAL VARCHAR2) IS
BEGIN
EXECUTE IMMEDIATE 'alter system kill session ''' || V_SID || ',' ||
V_SERIAL || '''';
END PRC_KILLSELF;


上面是自殺的程式。


CREATE OR REPLACE PROCEDURE PRC_COMMITJOB(V_SID NUMBER, V_SERIAL NUMBER) IS
V_RETURN NUMBER;
BEGIN
DBMS_JOB.SUBMIT(JOB => V_RETURN,
WHAT => 'prc_killself(' || V_SID || ',' || V_SERIAL || ');');
COMMIT;
END PRC_COMMITJOB;


上面是把自殺過程提交為job的程式。下面來看看執行的結果:


SQL> select distinct sid from v$mystat;

SID
----------
843

SQL> select sid,serial# from v$session where sid=843;

SID SERIAL#
---------- ----------
843 243

SQL> exec PRC_COMMITJOB(843,243);

PL/SQL procedure successfully completed.

SQL> desc v$session;
ERROR:
ORA-00028: your session has been killed


可以看到自己的session已經被殺掉了,desc命令已經不能執行。

附:此過程是在sys使用者下直接做的測試,如果其他使用者下,kill session需要alter system的許可權(網上搜來的,偶未測試)。

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

相關文章