【问题标题】:How to kill own Oracle SQL sessions without DBA privileges?如何在没有 DBA 权限的情况下终止自己的 Oracle SQL 会话?
【发布时间】:2020-07-01 02:47:30
【问题描述】:

在没有 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

注意:我通过 R/Rstudio 使用 RJDBC 包连接 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

并且必须等待超时。

【问题讨论】:

  • 关于在此处执行此操作的好文章dba-oracle.com/t_granting_alter_system_kill_session.htm 但简而言之,要么让 DBA 编写一个将终止会话的过程(使用适当的安全保护)并在该过程上授予执行权限,要么让他们授予 ALTER SESSION (我在所有开发数据库上都有这个,肯定不会在 PROD 上授予)
  • @ShaunPeterson - 我猜你的意思是 ALTER SYSTEM? ALTER SESSION 与杀死会话无关。
  • @mathguy 是的,你是对的,谢谢你接受这个。

标签: sql r oracle jdbc database-administration


【解决方案1】:

我们可以使用 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>

【讨论】:

    【解决方案2】:

    您必须在 sys.v_$session 上创建直接选择授权

    将 v_$session 上的选择授予

    拥有上述过程的架构在哪里。这必须是直接授权,而不是通过角色。

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

    【讨论】:

      【解决方案3】:

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

          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;
      

      【讨论】:

        【解决方案4】:

        要成功运行ALTER SYSTEM 命令,您不需要是 DBA,但您确实需要授予您(或“用户”)ALTER SYSTEM 权限拥有您连接到数据库的应用程序 - 这可能与作为 RStudio 的“用户”的“您”不同)。

        你有几个选择:

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

        【讨论】:

          猜你喜欢
          • 2010-11-13
          • 2018-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          • 2013-07-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多