如何在没有 DBA 权限的情况下终止自己的 Oracle SQL 会话?

How to kill own Oracle SQL sessions without DBA privileges?

有没有办法让用户在没有 DBA 权限的情况下终止自己的 session/connections,给定 Oracle SID?

具体来说,我可以 运行 在我的数据库中没有管理员权限:

SELECT SID, "SERIAL#", STATUS, USERNAME
 FROM V$SESSION
 WHERE 
 (USERNAME = 'LastF') 
 AND
 (STATUS = 'INACTIVE');

但是当我结束我的孤立会话时(从另一个我仍然可以访问的会话),

ALTER SYSTEM KILL SESSION "12, 123"

我得到以下信息:

JDBC ERROR: ORA-01031: insufficient privileges

注意:我正在使用 RJDBC 包通过 R/Rstudio 与 JDBC 连接。

动机:

在 Oracle SQL 中终止会话似乎并不难: https://docs.oracle.com/cd/B28359_01/server.111/b28310/manproc008.htm#ADMIN11192
How can I kill all sessions connecting to my oracle database?

但是,对于拥有孤立连接(即互联网中断、管理连接错误的第 3 方客户端等)的非 DBA 用户来说,获得以下信息确实令人沮丧:

ORA-02391 exceeded simultaneous SESSIONS_PER_USER limit

并且必须等待超时。

要成功 运行 ALTER SYSTEM 命令,您不需要成为 DBA,但 需要 ALTER SYSTEM授予您的特权(或授予拥有您连接到数据库的应用程序的 "user" - 这可能不同于 "you" 作为 RStudio 的 "user")。

您有几个选择:

  • 请求 DBA 终止会话
  • 要求获得 ALTER SYSTEM 权限(这是一种非常糟糕的做法)
  • 授予 "supervisor"(无论如何定义 - 专门负责这些情况)的 ALTER SYSTEM 权限,谁将负责终止此类会话
  • (也许是最好的选择)创建一个打包的 其唯一任务是终止孤立会话的过程。授予包所有者 ALTER SYSTEM,并授予执行权限 打包给个人用户(根据需要)。程序应该是 仅用于终止特定类型的会话。

您可以使用以下命令取消会话运行中的任何内容

    DECLARE
      l_status  v$session.status%TYPE;
    BEGIN

      dbms_system.set_ev( &sid, &serial, 10237, 1, '');

      LOOP
        SELECT status INTO l_status FROM v$session
          WHERE sid = &sid and serial# = &serial;
        EXIT WHEN l_status='INACTIVE';
      END LOOP;

      dbms_system.set_ev( &sid, &serial, 10237, 0, '');
    END;

您必须在 sys.v_$session

上创建直接 select 资助

将 v_$session 上的 select 授予

拥有上述过程的模式在哪里。这必须是直接拨款,而不是通过角色。

查看 link 了解更多详情,由 Donald Burleson

提供

我们可以用 pid 终止 oracle 会话, 如果您无法从查询中识别操作系统进程标识符 (spid),您可以发出以下查询以帮助识别正确的会话:

SELECT s.sid, s.serial#, p.spid
FROM v$process p, v$session s
WHERE p.addr = s.paddr
AND s.username = '<username>';

在操作系统提示符下,发出 kill 命令并提供操作系统进程标识符 (spid):

kill <spid>