如何为用户终止所有活动和非活动oracle会话

And*_*rew 21 oracle session schema stored-procedures

我正在尝试以下脚本立即杀死用户的所有活动和非活动oracle会话,但它不起作用.该脚本成功执行但不会终止用户的会话.

BEGIN
  FOR r IN (select sid,serial# from v$session where username = 'USER')
  LOOP
    EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid 
      || ',' || r.serial# || '''';
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

Lal*_*r B 20

KILL SESSION命令实际上不了会议.它只是要求会话自杀.在某些情况下,例如等待远程数据库的回复或回滚事务,会话不会立即自行终止并等待当前操作完成.在这些情况下,会话将具有" 标记为杀死 "的状态.然后它会尽快被杀死.

检查状态以确认:

SELECT sid, serial#, status FROM v$session;
Run Code Online (Sandbox Code Playgroud)

您还可以使用IMMEDIATE子句:

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
Run Code Online (Sandbox Code Playgroud)

IMMEDIATE子句不会影响命令执行的工作,但它会立即将控制权返回给当前会话,而不是等待确认kill.看看Killing Oracle Sessions.

更新如果要杀死所有会话,则可以准备一个小脚本.

SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;' FROM v$session;
Run Code Online (Sandbox Code Playgroud)

将上述内容假冒为一个.sql文件并执行它.

  • 杀死al会话:`SELECT'ALTER SYSTEM KILL SESSION'''|| sid ||','|| serial#||''''' FROM v $ session;`然后复制结果并执行.作者忘了放一些'人物 (4认同)

小智 18

BEGIN
  FOR r IN (select sid,serial# from v$session where username='user')
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid  || ',' 
        || r.serial# || ''' immediate';
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

这应该工作 - 我只是更改了您的脚本以添加immediate关键字.正如之前的答案所指出的那样,kill session唯一标志着杀戮的会议; 它不会立即这样做但后来方便时.

从您的问题来看,您似乎希望立即看到结果.因此,immediate关键字用于强制执行此操作.


elk*_*koo 6

执行此脚本:

SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;' 
FROM v$session 
where username='YOUR_USER';
Run Code Online (Sandbox Code Playgroud)

它将打印出应执行的sql。


cha*_*pta 6

BEGIN
  FOR r IN (select sid,serial# from v$session where username='user')
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid  || ',' || r.serial# || '''';
  END LOOP;
END;
/
Run Code Online (Sandbox Code Playgroud)

这个对我有用。