如何在没有DBA特权的情况下杀死自己的Oracle SQL会话?

问题描述 投票:3回答:2

给定Oracle SID,没有DBA权限,用户是否可以终止用户自己的会话/连接?

特别是,我可以在没有管理员权限的情况下在数据库中运行它:

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#ADMIN11192How can I kill all sessions connecting to my oracle database?

但是,对于具有孤立连接(即互联网中断,解决连接错误的第三方客户端等)的非DBA用户,获取以下信息可能会令人沮丧:

ORA-02391 exceeded simultaneous SESSIONS_PER_USER limit

并且必须等待超时。

sql r oracle jdbc database-administration
2个回答
5
投票

要成功运行ALTER SYSTEM命令,您不必是DBA,但您do需要将ALTER SYSTEM特权授予您(或通过以下方式授予拥有该应用程序的“用户”)您连接到数据库的数据库-可能与RStudio的“用户”的“您”不同)。

您有几种选择:

  • 要求DBA终止会话
  • 要求被授予ALTER SYSTEM特权(这是非常差的做法)
  • [具有“主管”(无论如何定义-专门负责这些情况)被授予ALTER SYSTEM特权,他将负责终止此类会话
  • (也许是最好的选择)创建一个打包的该程序的唯一任务是杀死孤立的会话。将ALTER SYSTEM授予程序包所有者,并授予该程序包的执行特权打包给各个用户(根据需要)。该程序应旨在仅杀死特定类型的会话。

0
投票

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

    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;
© www.soinside.com 2019 - 2024. All rights reserved.