给定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
并且必须等待超时。
要成功运行ALTER SYSTEM
命令,您不必是DBA,但您do需要将ALTER SYSTEM
特权授予您(或通过以下方式授予拥有该应用程序的“用户”)您连接到数据库的数据库-可能与RStudio的“用户”的“您”不同)。
您有几种选择:
ALTER SYSTEM
特权(这是非常差的做法)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;