我的任务是允许开发人员在开发数据库中终止他们自己的会话。我已经编写了一个程序,但由于某种原因,我PL/SQL: ORA-00942: table or view does not exist
在尝试调用gv$session
. 这是 proc,被编译为SYSTEM
. 在 11.2.0.4.3、2 节点 RAC 数据库上运行:
create or replace procedure kill_dev_session (v_osname in varchar2)
is
lv_env VARCHAR2(30 char);
li_inst_id number;
li_sid number;
li_serial number;
begin
select replace(global_name, '.DOMAIN.COM', '')
into lv_env
from global_name;
select inst_id, sid, serial#
into li_inst_id, li_sid, li_serial
from sys.gv$session
where upper(osuser) = upper(v_osname)
group by inst_id, sid, serial#;
EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION'||''||li_sid||','||li_serial||','||li_inst_id||'''';
EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''127.0.0.1''';
UTL_MAIL.send(sender => lv_env||'@db01.domain.com',
recipients => '[email protected]',
subject => 'Session killed by '||v_osname||' user in '||lv_env,
message => 'This user killed a session using the kill_dev_session procedure.',
mime_type => 'text; charset=us-ascii');
end;
/
所以问题来了:每个开发人员都使用同一个用户登录,所以我不能真正使用username
. 我不想alter system
为每个用户打开毯子。这将允许开发经理传递用户名(即 jsmith)并终止该会话,并通过电子邮件向我们 DBA 告知发生了这种情况,因此我们可以查看开发人员是否经常这样做。
关于我为什么看到这个的任何想法:PROCEDURE KILL_DEV_SESSION 的错误:
LINE/COL ERROR
-------- -----------------------------------------------------------------
12/3 PL/SQL: SQL Statement ignored
14/10 PL/SQL: ORA-00942: table or view does not exist
提前致谢!
尝试这样做:
因为您在存储过程中按系统访问 sys 表,所以您需要对基础表进行直接授权。
看起来汤姆凯特有答案:https ://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:22541885338185
甘道夫,根据汤姆的回应,您在技术上是正确的,但无论出于何种原因(错误?用户错误?)我无法让它发挥作用。
所以我尝试了解决方法:
现在正在工作。当然,如您所见,我还必须将内部 sql 更改为循环,因为如果用户使用 2+ 会话登录,这将不起作用。
此外,它仍然无法正常工作,因为查询的行为正在执行并行查询,这意味着有一大堆“幽灵”会话 id 仅在查询时存在,导致此过程返回:
但是,嘿,没有挑战的生活是什么?我会解决这个问题,如果我自己无法解决问题,可能会在论坛上发布另一个问题。谢谢您的帮助。