Oracle解锁表、包、用户、杀会话、停job的方法实现

 更新时间:2023年12月14日 15:22:10   作者:Tzq@2018  
本文主要介绍了Oracle解锁表、包、用户、杀会话、停job的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、创建包tzq_server_pkg

sys用户以sysdba身份登录Oracle数据库,创建包 tzq_server_pkg ,上代码:

CREATE OR REPLACE PACKAGE sys.tzq_server_pkg IS

  PROCEDURE unlock_table(table_owner IN VARCHAR2, table_name IN VARCHAR2);

  PROCEDURE unlock_package(package_owner IN VARCHAR2,
                           package_name  IN VARCHAR2);

  PROCEDURE unlock_user(username IN VARCHAR2);

  PROCEDURE stop_job(job_id IN NUMBER);

  PROCEDURE kill_session(se_sid IN NUMBER, se_serail# IN NUMBER);
  PROCEDURE grant_pris(username IN VARCHAR2);
END tzq_server_pkg;
/

CREATE OR REPLACE PACKAGE body SYS.tzq_server_pkg IS

  PROCEDURE unlock_table(table_owner IN VARCHAR2, table_name IN VARCHAR2) IS
    CURSOR c1 IS
      SELECT DISTINCT '''' || s.sid || ',' || s.serial# || ',@' || s.inst_id || '''' AS si_id
        FROM gv$locked_object l
            ,dba_objects      o
            ,gv$session       s
       WHERE l.object_id = o.object_id
         AND l.session_id = s.sid
         AND l.inst_id = s.inst_id
         AND o.owner = upper(table_owner)
         AND o.object_name = upper(table_name);
    c1_rec c1%ROWTYPE;
    v_sql  VARCHAR2(2000);
  BEGIN
    FOR c1_rec IN c1 LOOP
      v_sql := 'alter system kill session ' || c1_rec.si_id || ' immediate';
      dbms_output.put_line(v_sql);
      BEGIN
        EXECUTE IMMEDIATE v_sql;
      EXCEPTION
        WHEN OTHERS THEN
          dbms_output.put_line(SQLERRM);
      END;
    END LOOP;
  END unlock_table;

  PROCEDURE unlock_package(package_owner IN VARCHAR2,
                           package_name  IN VARCHAR2) IS
    CURSOR c1 IS
      SELECT DISTINCT '''' || a.sid || ',' || a.serial# || ',@' || a.inst_id || '''' AS si_id
        FROM gv$session a
            ,gv$access  b
       WHERE b.object = upper(package_name)
         AND b.owner = upper(package_owner)
         AND a.sid = b.sid
         AND a.inst_id = b.inst_id;
    c1_rec c1%ROWTYPE;
    v_sql  VARCHAR2(2000);
  BEGIN
    FOR c1_rec IN c1 LOOP
      v_sql := 'alter system kill session ' || c1_rec.si_id || ' immediate';
      dbms_output.put_line(v_sql);
      BEGIN
        EXECUTE IMMEDIATE v_sql;
      EXCEPTION
        WHEN OTHERS THEN
          dbms_output.put_line(SQLERRM);
          NULL;
      END;
    END LOOP;
  END unlock_package;

  PROCEDURE unlock_user(username IN VARCHAR2) IS
    us_name VARCHAR2(200) := username;
    v_sql   VARCHAR2(2000);
  BEGIN
    v_sql := 'alter user ' || us_name || ' account unlock';
    BEGIN
      EXECUTE IMMEDIATE v_sql;
      dbms_output.put_line(us_name || '''s account is unlock');
    EXCEPTION
      WHEN OTHERS THEN
        dbms_output.put_line(SQLERRM);
    END;
  END unlock_user;

  PROCEDURE stop_job(job_id IN NUMBER) IS
    CURSOR c1 IS
      SELECT DISTINCT '''' || a.sid || ',' || a.serial# || ',@' || a.inst_id || '''' AS si_id
        FROM gv$session a
            ,(SELECT v.sid
                    ,v.id2     job
                    ,v.inst_id inst_id
                FROM sys.job$ j
                    ,gv$lock  v
               WHERE v.type = 'JQ'
                 AND j.job(+) = v.id2) b
            ,gv$instance c
       WHERE a.inst_id = b.inst_id
         AND a.sid = b.sid
         AND a.inst_id = c.inst_id
         AND c.inst_id = b.inst_id
         AND b.job = job_id;
    c1_rec c1%ROWTYPE;
    v_sql  VARCHAR2(2000);
  BEGIN
    FOR c1_rec IN c1 LOOP
      v_sql := 'alter system kill session ' || c1_rec.si_id || ' immediate';
      dbms_output.put_line(v_sql);
      BEGIN
        EXECUTE IMMEDIATE v_sql;
      EXCEPTION
        WHEN OTHERS THEN
          dbms_output.put_line(SQLERRM);
          NULL;
      END;
    END LOOP;
  END stop_job;

  PROCEDURE kill_session(se_sid IN NUMBER, se_serail# IN NUMBER) IS
    p_sid           NUMBER := se_sid;
    p_serail        NUMBER := se_serail#;
    is_back_process NUMBER := 0;
    CURSOR c1 IS
      SELECT DISTINCT '''' || a.sid || ',' || a.serial# || ',@' || a.inst_id || '''' AS si_id
        FROM gv$session a
       WHERE a.sid = p_sid
         AND a.serial# = p_serail;
    c1_rec c1%ROWTYPE;
    v_sql  VARCHAR2(2000);
  BEGIN
    IF se_sid IS NULL OR se_serail# IS NULL THEN
      dbms_output.put_line('sid is null or serail# is null');
      RETURN;
    END IF;
    BEGIN
      SELECT 1
        INTO is_back_process
        FROM gv$session
       WHERE sid = se_sid
         AND serial# = se_serail#
         AND TYPE = 'BACKGROUND';
    EXCEPTION
      WHEN OTHERS THEN
        is_back_process := 0;
    END;
    IF is_back_process = 1 THEN
      RETURN;
    END IF;
    FOR c1_rec IN c1 LOOP
      v_sql := 'alter system kill session ' || c1_rec.si_id || ' immediate';
      dbms_output.put_line(v_sql);
      BEGIN
        EXECUTE IMMEDIATE v_sql;
      EXCEPTION
        WHEN OTHERS THEN
          dbms_output.put_line(SQLERRM);
          NULL;
      END;
    END LOOP;
  END kill_session;

  PROCEDURE grant_pris(username IN VARCHAR2) IS
    us_name VARCHAR2(200) := username;
    v_sql   VARCHAR2(2000);
    v_sql2  VARCHAR2(2000);
    v_sql3  VARCHAR2(2000);
    v_sql4  VARCHAR2(2000);
    v_sql5  VARCHAR2(2000);
    v_sql6  VARCHAR2(2000);
    v_sql7  VARCHAR2(2000);
  BEGIN
    v_sql  := 'grant create synonym,create table,create type,create sequence,create view ,create materialized view,create job,create database link,connect,resource,create procedure ,debug any procedure, debug connect session to ' ||
              us_name;
    v_sql2 := 'grant select on gv_$locked_object to ' || us_name;
    v_sql3 := 'grant select on dba_objects to ' || us_name;
    v_sql4 := 'grant select on gv_$session to ' || us_name;
    v_sql5 := 'grant select on gv_$process to ' || us_name;
    v_sql6 := 'grant select on gv_$sql to ' || us_name;
    v_sql7 := 'grant select on gv_$access  to ' || us_name;
    BEGIN
      EXECUTE IMMEDIATE v_sql;
      EXECUTE IMMEDIATE v_sql2;
      EXECUTE IMMEDIATE v_sql3;
      EXECUTE IMMEDIATE v_sql4;
      EXECUTE IMMEDIATE v_sql5;
      EXECUTE IMMEDIATE v_sql6;
      EXECUTE IMMEDIATE v_sql7;
      dbms_output.put_line('grant success!');
    EXCEPTION
      WHEN OTHERS THEN
        dbms_output.put_line(SQLERRM);
    END;
  END grant_pris;

END tzq_server_pkg;
/

二、授权给需要使用的用户log

sys用户以sysdba身份登录Oracle数据库,给需要使用该包(sys.tzq_server_pkg)的用户授予 execute 的权限,执行下面命令授权:

grant execute on sys.tzq_server_pkg to log;

在这里插入图片描述

三、解锁表:执行存过unlock_table(schema_name, table_name)

以上面被授权的log用户,打开命令行窗口,执行下列SQL:

set serveroutput on
execute sys.tzq_server_pkg.unlock_table('LOG','tzq_log_t');

在这里插入图片描述

四、解锁包:执行存过unlock_package(schema_name, pkg_name)

以上面被授权的log用户,打开命令行窗口,执行下列SQL:

set serveroutput on
execute sys.tzq_server_pkg.unlock_package('LOG','tzq_log_pkg');

在这里插入图片描述

五、解锁用户:执行存过unlock_user(username)

以上面被授权的log用户,打开命令行窗口,执行下列SQL:

set serveroutput on
execute sys.tzq_server_pkg.unlock_user('LOG');

在这里插入图片描述

六、停止job任务:执行存过stop_job(job_id)

以上面被授权的log用户,打开命令行窗口,执行下列SQL:

set serveroutput on
execute sys.tzq_server_pkg.stop_job(6);

在这里插入图片描述

七、杀session会话:执行存过kill_session(se_sid, se_serail#)

7.1、查询需要kill的session的SID及serial#

执行下列SQL:

SELECT * FROM gv$session;

找到你需要kill的那个session会话,拿到SID及serial#:159, 3729

在这里插入图片描述

7.2、执行存过kill_session(se_sid, se_serail#)

执行存过kill_session(),kill掉上面的那个session会话。在命令行执行下面的SQL:

set serveroutput on
execute sys.tzq_server_pkg.kill_session(159, 3729);

在这里插入图片描述

八、给新建的用户授权:执行存过 grant_pris(username)

以上面被授权的log用户,打开命令行窗口,执行下列SQL:

set serveroutput on
execute sys.tzq_server_pkg.grant_pris('log');

在这里插入图片描述

 到此这篇关于Oracle解锁表、包、用户、杀会话、停job的方法实现的文章就介绍到这了,更多相关Oracle解锁表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PDO取Oracle lob大字段,当数据量太大无法取出的问题的解决办法

    PDO取Oracle lob大字段,当数据量太大无法取出的问题的解决办法

    最近,做sns的项目,用PDO连接Oracle数据库,读取Clob字段,当数据量非常大的时候(上万个字符),返回空值,从网上也没有查到相关的资料。自己刻苦研究加上同事帮助,终于解决了。废话就不说了,下面把内容贴出来。
    2009-03-03
  • Oracle Sqlplus命令登录多种方式案例讲解

    Oracle Sqlplus命令登录多种方式案例讲解

    这篇文章主要介绍了Oracle Sqlplus命令登录多种方式案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Oracle Instr函数实例讲解

    Oracle Instr函数实例讲解

    instr函数为字符查找函数,其功能是查找一个字符串在另一个字符串中首次出现的位置,instr函数在Oracle/PLSQL中是返回要截取的字符串在源字符串中的位置,这篇文章主要介绍了Oracle Instr函数实例讲解,需要的朋友可以参考下
    2022-11-11
  • Oracle DECODE函数语法使用介绍

    Oracle DECODE函数语法使用介绍

    DECODE是Oracle公司独家提供的功,该函数功能强大,下文对DECODE函数的语法作了详尽的阐述,供您参考学习
    2013-05-05
  • 利用PL/SQL从Oracle数据库导出和导入数据

    利用PL/SQL从Oracle数据库导出和导入数据

    这篇文章主要为大家详细介绍了利用PL/SQL从Oracle数据库导出数据和导入数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Oracle中字符串截取常用方法总结【推荐】

    Oracle中字符串截取常用方法总结【推荐】

    这篇文章主要介绍了Oracle中字符串截取常用方法总结,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • Oracle出现超出打开游标最大数的解决方法

    Oracle出现超出打开游标最大数的解决方法

    这篇文章主要介绍了Oracle出现超出打开游标最大数的解决方法,涉及针对Oracle游标位置的判断与处理技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • Oracle中检查是否需要重构索引的sql

    Oracle中检查是否需要重构索引的sql

    经常需要在Oracle中检查是否需要重构索引,在此写了个示例语句,有此需求的朋友可以参考下,希望对大家有所帮助
    2013-08-08
  • 通过实例了解Oracle序列Sequence使用方法

    通过实例了解Oracle序列Sequence使用方法

    这篇文章主要介绍了通过实例了解Oracle序列Sequence使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Zabbix监控Oracle归档日志空间的全过程

    Zabbix监控Oracle归档日志空间的全过程

    本文将介绍Zabbix监控Oracle归档日志空间的全过程,Zabbix是一个开源的监控系统,它可以监控各种不同类型的服务器和服务,如果您想要监控Oracle数据库,文中是一些简单的步骤,需要的朋友可以参考下
    2024-04-04

最新评论