如何在没有 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>
有没有办法让用户在没有 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>