ERP(TIPTOP)用户自行解锁操作说明(p_kill)

ERP(TIPTOP)用户自行解锁操作说明(试运行)

 

#操作截图①

 

 

--------------------------------------------------------------------线-----------------

 

#操作截图

 

--------------------------------------------------------------------线-----------------

 

 

# 说明

 

   1.操作说明①:用户输入程序编号p_kill,自动打开界面,自动带出当前登录ERP用户。

(备注: 此处[ERP用户编号]已做输入限制,ERP用户为CLASS-ACLASS-A1的用户可以输入其它用户进行解锁,反之只能对自己用户产生锁表进行解锁)

 

   2.操作说明②:用户输入完成之后,点击确定,然后再点击右边解除锁表按钮,作业会根据当前用户编号,进入数据库查找到此用户造成的表死锁,找到后并将其解除,由于公司数据库为oracle rac此过程会等上1~2分钟。

 

   3.解锁成功之后会弹出以下提示:

         

   4.此作业已经做好了管控,可以给各个基地的user提供执行权限(试运行暂时先开几个用户权限),方便在我们休假的时候,用户锁表,自行运行此作业进行解锁。

 

 

 

--------------------------------------------------------------------线-----------------

 

####(程序原理说明)

  1.新建作业 p_kill ()

  2oralce 数据库建立functionprocedure

Procedure:在oracle system用户下建立procedurexxxx,并将procedure的执行权限赋给其它营运中心(即其它oracle用户)

授权语句如下:

grant excute on xxxx(procedurename) to xx(user)

Function:在function里面调用procedure(因为GP版本太低,直接调用存储过程导致编译不通过!),记得每个营运中心都建立这个一模一样的function

  3.本作业主要调用的function和存储过程如下

fuction :

CREATE OR REPLACE FUNCTION killtable(var_name1 VARCHAR2 )
returnVARCHAR2  IS
 var_log VARCHAR2(200);
begin
  locktablekill(var_name =>var_name1,var_result => var_log);
  RETURN(var_log);
end ;

--------------------------------------------------------------------线-----------------

 

procedure:

CREATEOR REPLACE PROCEDURE LOCKTABLEKILL(VAR_NAME  IN VARCHAR2,
                                          VAR_RESULTOUT VARCHAR2) IS
  VAR_SID    VARCHAR2(20);
  VAR_SERIALVARCHAR2(20);
  VAR_SQL    VARCHAR2(2000);
  VAR_SQL2   VARCHAR2(2000);
  VAR_USER   VARCHAR2(20);
  VAR_END    VARCHAR2(50);
 ----------------------------------------------------------------------
 ---description :  erp 用户调用procedure 给用户解锁
 ---date&author : add by kk 2014-10-23
  ---environment: oracle 10g  RAC
 ----------------------------------------------------------------------
BEGIN
  VAR_USER :=VAR_NAME;
  VAR_SQL  := 'select a.sid,a.serial#  FROM                                                                                                                                     
(SELECTSUBSTR(all_objects.owner||''.''||object_name,1,16) LockedOBJECT                                                            
,SUBSTR(os_user_name,1,10)TiptopUser                                                                                           
,gv$locked_object.processProcID                                                                                                
,SUBSTR(terminal,1,7)Terminal                                                                                                  
,gv$session.sid,gv$session.serial#                                                                                                 
,gv$session.machine                                                                                                                
,gv$session.INST_ID                                                                                                                
  FROMgv$locked_object,all_objects,gv$session                                                                                     
 WHEREgv$locked_object.object_id=all_objects.object_id                                                                             
   ANDgv$locked_object.SESSION_ID=gv$session.SID
) awhere   a.TiptopUser = ''' || VAR_USER ||'''
ANDrownum =1 ';
 
 --------------------------------------------------------------------------------------------  
  --上面这段sql只针对oracle 10g RAC, 如果是非RAC就简单多了,sql重新写下.
--这里只取了一行,当然你如果想把用户所有的锁表都罗列然后解锁 ,
  --可以考虑使用cursor, 然后再loop,循环使用alter命令干掉进程 ;
 --------------------------------------------------------------------------------------------
  DBMS_OUTPUT.PUT_LINE(VAR_SQL);
  EXECUTE IMMEDIATE VAR_SQL
    INTO VAR_SID, VAR_SERIAL;
  IF VAR_SID IS NOT NULL AND VAR_SERIAL IS NOTNULL THEN
    SELECT VAR_SID || ',' || VAR_SERIAL INTOVAR_END FROM DUAL;
    VAR_RESULT := '死锁用户存在';
    DBMS_OUTPUT.PUT_LINE(VAR_END);
    VAR_SQL2 := 'alter system killsession ''' || VAR_END ||''' immediate ';
    DBMS_OUTPUT.PUT_LINE(VAR_SQL2);
    EXECUTE IMMEDIATE VAR_SQL2;
    VAR_RESULT := '死锁用户存在,且已经解锁!请重新运行ERP作业!';
  END IF;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    VAR_RESULT := '不存在死锁的用户';
END;

 

___________________________________________________________________

--------界面粗糙了一点,内容也单调了一些,功能还不够强大,后期继续改进------

---------各位大神多支招,感谢!!!-------------------------------------------------------------

------------------------------------------------edit by  kk  2014-10-23------------------

------------------------------------------------QQ309200966--------------------------------

___________________________________________________________________

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值