【发布时间】:2019-11-16 05:26:08
【问题描述】:
我想自动化以下场景 -
Kill all of sessions of a user.
我想在单个 sql 查询中实现这一点。我查看了Dropping connected users in Oracle database,其中一个 cmets 给出了单个 sql 查询,但这无助于终止单个查询中的所有会话。
有人可以帮助我通过单个查询来终止用户的所有会话吗?
【问题讨论】:
我想自动化以下场景 -
Kill all of sessions of a user.
我想在单个 sql 查询中实现这一点。我查看了Dropping connected users in Oracle database,其中一个 cmets 给出了单个 sql 查询,但这无助于终止单个查询中的所有会话。
有人可以帮助我通过单个查询来终止用户的所有会话吗?
【问题讨论】:
简单地说(据我所知),你不能那样做。
会话被一个接一个地杀死,而不是all-sessions-for-user。
如果您想使用一行代码(作为最终结果)来完成这项工作,请创建一个存储过程来为您完成这项工作。
以有权执行此操作的用户身份连接(例如 SYS,除非您为此创建了自己的用户):
SQL> set serveroutput on;
SQL> create or replace procedure p_kill (par_username in varchar2) is
2 l_str varchar2(100);
3 begin
4 for cur_r in (select s.sid, s.serial#
5 from v$session s
6 where s.username = par_username
7 )
8 loop
9 l_str := 'alter system kill session ' || chr(39) ||
10 cur_r.sid || ', '|| cur_r.serial# || chr(39);
11 dbms_output.put_line(l_str);
12 execute immediate l_str;
13 end loop;
14 end;
15 /
Procedure created.
我有两个用于用户 MIKE 的会话(在两个单独的 SQL*Plus 窗口中打开),我想将它们全部杀死:
SQL> exec p_kill ('MIKE');
alter system kill session '12, 133'
alter system kill session '139, 265'
PL/SQL procedure successfully completed.
SQL>
这对 MIKE 有什么影响?像这样:
SQL> select * From tab;
select * From tab
*
ERROR at line 1:
ORA-00028: your session has been killed
SQL>
所以,如您所见,最后这就是您所需要的:
exec p_kill ('MIKE');
【讨论】: