一、问题描述
数据库死锁是比较常见的问题,但是在达梦数据库中,关闭死锁的会话只能用有DBA角色的账号才能关闭会话,每次都要找到DBA才能关闭,下面教如何使用自己的账号关闭自己账号下的死锁会话。
二、解决办法
处理方法就是通过存储过程将功能封装起来,然后将过程授权给用户。
使用SYSDBA用户来创建存储过程并赋权。
1.封装存储过程
CREATE OR REPLACE PROCEDURE kill_session(session_id bigint)
IS
sessid_count INT;
e2 EXCEPTION;
pragma exception_init (e2,-20096);
BEGIN
-- 对用户 会话的判断
SELECT COUNT(1)
INTO
sessid_count
FROM v$sessions
WHERE sess_id=session_id
AND user_name=USER;
IF sessid_count=1 THEN
sp_close_session(session_id);
ELSE
raise e2;
END IF;
EXCEPTION
WHEN e2 THEN
PRINT SQLCODE||': SESS_ID('||session_id||') DOES NOT EXISTS, OR THE SESSION USER IS NOT '||USER;
END;
2.授权并创建同义词
grant exec on kill_session to DMTEST;
CREATE OR REPLACE SYNONYM "DMTEST".sp_close_session FOR "SYSDBA".kill_session;
三、创建好上面两项之后,就可以使用自己账号KILL自己账号下的会话了,使用方法如下:
call DMTEST.sp_close_session(124116416);
文章
阅读量
获赞