开发a在测试环境操作时有时会遇到阻塞问题,需要找dba帮忙查看阻塞会话及kill session,后来觉得太麻烦想要个kill会话的权限,查了下oracle授予普通用户kill session权限的方法。
1. 授予alter system权限
官方文档查到,kill session需要alter system权限,但是这个权限非常大,不能直接给
grant alter system to <username>;
2. 创建存储过程
后来查到了可以自己创建存储过程实现,简单的实现方法如下:
-- sys执行 create or replace procedure kill_session ( v_sid number, v_serial number ) as v_varchar2 varchar2(100); begin execute immediate 'alter system kill session ''' || v_sid || ',' || v_serial || ''''; end; / -- 授权: grant execute on kill_session to username; -- 普通用户使用: exec sys.kill_session(161,14502);
还能加各种限制条件,例如写入日志,记录是谁在什么时候发起的、kill了谁,视需要而定。
创建审计表
create table action_audit ( id number generated always as identity, operator_name varchar2(50) not null, action_time timestamp not null, session_id number(10) not null, serial_id number(10) not null, sql_id varchar2(13), constraint action_audit_pk primary key (id) );
创建存储过程
create or replace procedure kill_session (
p_session_id number,
p_serial_id number
) as
v_sql_id varchar2(13);
begin
select s.sql_id into v_sql_id from v$session s where s.sid = p_session_id and s.serial# = p_serial_id;
execute immediate 'alter system kill session ''' || p_session_id || ',' || p_serial_id || ''' immediate';
insert into action_audit (
operator_name,
action_time,
session_id,
serial_id,
sql_id
) values (
sys_context('userenv','os_user'),
current_timestamp,
p_session_id,
p_serial_id,
v_sql_id
);
commit;
exception
when others then
raise_application_error(-20001, 'error in killing session: ' || sqlerrm);
end;
/运行方法同上~
到此这篇关于oracle授予普通用户kill session权限的方法的文章就介绍到这了,更多相关oracle授予普通用户kill权限内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论