【技巧】如何让普通用户可以杀掉自己用户的会话

 技巧】如何让普通用户可以杀掉自己用户的会话

 

 BLOG文档结构图

wps6BA9.tmp 

 

 前言部分

 

2.1  导读和注意事项

各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~

① 如何让普通用户可以杀掉自己用户的会话(重点)

 

  Tips

① 本文在itpubhttp://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和微信公众号(xiaomaimiaolhr)有同步更新

② 文章中用到的所有代码,相关软件,相关资料请前往小麦苗的云盘下载(http://blog.itpub.net/26736162/viewspace-1624453/

③ 若网页文章代码格式有错乱,推荐使用360浏览器,也可以下载pdf格式的文档来查看,pdf文档下载地址:http://blog.itpub.net/26736162/viewspace-1624453/,另外itpub格式显示有问题,也可以去博客园地址阅读

④ 本篇BLOG中命令的输出部分需要特别关注的地方我都用灰色背景和粉红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33thread 2的最大归档日志号为43是需要特别关注的地方;而命令一般使用黄色背景和红色字体注;对代码或代码输出部分的注释一般采用蓝色字体表示

  List of Archived Logs in backup set 11

  Thrd Seq     Low SCN    Low Time            Next SCN   Next Time

  ---- ------- ---------- ------------------- ---------- ---------

  1    32      1621589    2015-05-29 11:09:52 1625242    2015-05-29 11:15:48

  1    33      1625242    2015-05-29 11:15:48 1625293    2015-05-29 11:15:58

  2    42      1613951    2015-05-29 10:41:18 1625245    2015-05-29 11:15:49

  2    43      1625245    2015-05-29 11:15:49 1625253    2015-05-29 11:15:53

[ZHLHRDB1:root]:/>lsvg -o

T_XLHRD_APP1_vg

rootvg

[ZHLHRDB1:root]:/>

00:27:22 SQL> alter tablespace idxtbs read write;

====2097152*512/1024/1024/1024=1G

本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。

 

2.2  相关参考文章链接

&  说明:

  有关kill session的更多内容可以参考我的bloghttp://blog.itpub.net/26736162/viewspace-2121019http://blog.itpub.net/26736162/viewspace-2121020

 

2.3  本文简介

普通用户想要杀掉会话必须要有ALTER SYSTEM的权限,但是该权限过大,用户可能使用该权限错杀其它用户的会话,所以,有没有其它办法可以实现该功能呢?该类问题也是DBA中常遇到的问题,下边作者给出一种解决方案。

首先,可以创建一个查询自己会话信息的视图,将该视图创建公共同义词,然后创建一个存储过程,该存储过程实现杀会话的需要,最后将该存储过程赋权给PUBLIC即可解决这个问题。

【这也是小麦苗即将出版的书中的一个小小节,提前分享给大家,o(∩_∩)o ,希望大家到时候多多捧场。】

 代码分享

代码实现过程如下:

 

CREATE OR REPLACE VIEW VW_MYOWNERSESSION_LHR

AS

SELECT * FROM V$SESSION WHERE USERNAME = USER;

 

CREATE OR REPLACE PUBLIC SYNONYM SYN_MYOWNERSESSION_LHR FOR SYS.VW_MYOWNERSESSION_LHR;

 

CREATE OR REPLACE PROCEDURE PRO_KILL_MYOWN_SESSION_LHR(P_INST    IN NUMBER,

                                                       P_SID     IN NUMBER,

                                                       P_SERIAL# IN NUMBER) IS

  V_IGNORE  PLS_INTEGER;

  V_VERSION VARCHAR2(10);

  V_INST_ID NUMBER;

BEGIN

  SELECT COUNT(*)

    INTO V_IGNORE

    FROM GV$SESSION D

   WHERE USERNAME = USER

     AND SID = P_SID

     AND SERIAL# = P_SERIAL#

     AND D.INST_ID = P_INST;

 

  SELECT SUBSTR(V.VERSION, 1, INSTR(V.VERSION, '.') - 1), V.INSTANCE_NUMBER

    INTO V_VERSION, V_INST_ID

    FROM V$INSTANCE V;

 

  IF (V_IGNORE = 1) THEN

 

    IF (V_VERSION = '10' AND V_INST_ID <> P_INST) THEN

      RAISE_APPLICATION_ERROR(-20001,

                              'Please connect to INSTANCE:' || P_INST ||

                              ',then retry');

    ELSIF (V_VERSION = '10' AND V_INST_ID = P_INST) THEN

      EXECUTE IMMEDIATE 'ALTER SYSTEM DISCONNECT SESSION ''' || P_SID || ',' ||

                        P_SERIAL# || ''' IMMEDIATE';

 

    ELSE

      EXECUTE IMMEDIATE 'ALTER SYSTEM DISCONNECT SESSION ''' || P_SID || ',' ||

                        P_SERIAL# || ',@' || P_INST || ''' IMMEDIATE';

    END IF;

 

  ELSE

    RAISE_APPLICATION_ERROR(-20002,

                            'You do not own session ''' || P_SID || ',' ||

                            P_SERIAL# ||',@' || P_INST || '''');

  END IF;

END PRO_KILL_MYOWN_SESSION_LHR;

/

 

CREATE OR REPLACE PUBLIC SYNONYM PRO_KILL_SESSION_LHR FOR SYS.PRO_KILL_MYOWN_SESSION_LHR;

 

GRANT SELECT ON SYN_MYOWNERSESSION_LHR TO PUBLIC;

GRANT EXECUTE ON PRO_KILL_SESSION_LHR TO PUBLIC;

 

使用方法:

SELECT USERENV('INSTANCE'),USERENV('SID') FROM DUAL;

SELECT V.INST_ID, SID,SERIAL#,PADDR,STATUS FROM SYN_MYOWNERSESSION_LHR V WHERE SID=1008 AND V.INST_ID=1 ;--假设上一步查询出来的SID1008,实例号为1

EXEC PRO_KILL_SESSION_LHR(1,1008,35038);--假设上一步查询出来的SERIAL#35038

 

 

3.1  代码演示

3.1.1  使用SYS用户杀PMON进程的会话

SYS@lhrdb21> SELECT A.SID,A.SERIAL#,USERENV('INSTANCE'),USERNAME FROM v$session a WHERE a.PROGRAM LIKE '%PMON%';

 

       SID    SERIAL# USERENV('INSTANCE') USERNAME

---------- ---------- ------------------- ------------------------------

       125          1                   1

 

SYS@lhrdb21> EXEC PRO_KILL_SESSION_LHR(1,125,1);

BEGIN PRO_KILL_SESSION_LHR(1,125,1); END;

 

*

ERROR at line 1:

ORA-20002: You do not own session '125,1,@1'

ORA-06512: at "SYS.PRO_KILL_MYOWN_SESSION_LHR", line 36

ORA-06512: at line 1

由于系统进程的用户名为空,所以避免了误杀系统进程。

3.1.2  使用SYS用户杀普通用户的会话

SYS@lhrdb21> SELECT A.SID,A.SERIAL#,USERENV('INSTANCE'),USERNAME FROM v$session a WHERE username='LHR';

 

       SID    SERIAL# USERENV('INSTANCE') USERNAME

---------- ---------- ------------------- ------------------------------

        79      16453                   1 LHR

 

SYS@lhrdb21>  EXEC PRO_KILL_SESSION_LHR(1,79,16453);

BEGIN PRO_KILL_SESSION_LHR(1,79,16453); END;

 

*

ERROR at line 1:

ORA-20002: You do not own session '79,16453,@1'

ORA-06512: at "SYS.PRO_KILL_MYOWN_SESSION_LHR", line 36

ORA-06512: at line 1

SYS@lhrdb21> conn lhr/lhr

Connected.

LHR@lhrdb21> EXEC PRO_KILL_SESSION_LHR(1,79,16453);

 

PL/SQL procedure successfully completed.

由于79会话属于LHR用户,所以避免了误杀其它用户的会话,当使用LHR用户的时候可以正常杀会话。

3.1.3  使用LHR用户杀其它用户的会话

LHR@lhrdb21> SELECT A.SID,A.SERIAL#,USERENV('INSTANCE'),USERNAME FROM v$session a WHERE username='LHRTEST';

 

       SID    SERIAL# USERENV('INSTANCE') USERNAME

---------- ---------- ------------------- ------------------------------

       142      12947                   1 LHRTEST

 

LHR@lhrdb21> EXEC PRO_KILL_SESSION_LHR(1,142,12947);

BEGIN PRO_KILL_SESSION_LHR(1,142,12947); END;

 

*

ERROR at line 1:

ORA-20002: You do not own session '142,12947,@1'

ORA-06512: at "SYS.PRO_KILL_MYOWN_SESSION_LHR", line 36

ORA-06512: at line 1

普通用户LHR也不能杀掉其它用户LHRTEST的会话。

 

  About Me

...............................................................................................................................

● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 本文在itpubhttp://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/viewspace-2124932/

● 本文博客园地址:http://www.cnblogs.com/lhrbest/p/5869495.html

● 本文pdf版:http://yunpan.cn/cdEQedhCs2kFz (提取码:ed9b

● 小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/

● QQ群:230161599     微信群:私聊

● 联系我请加QQ好友(642808185),注明添加缘由

● 于 2016-09-13 10:00~ 2016-09-13 11:2在中行完成

● 文章内容来源于小麦苗的学习笔记部分整理自网络,若有侵权或不当之处还请谅解!

● 【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】

...............................................................................................................................

手机长按下图识别二维码或微信客户端扫描下边的二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,免费学习最实用的数据库技术。

wps6BBA.tmp

 

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

聊聊Data Guard中的DG Broker - 2016-09-20 18:09:07

    DG Broker是Oracle为Data Guard维护提供的一个很不错的工具,从我的实际使用来看,早期的版本中似乎大家都还是存在一定的思维定式,认为手工维护已经足够了。这个工具就不那么需要了,我们完全可以脱离开这些工具来直观的使用命令行的方式来维护,这个观点也没错,不过从与时俱进的角度来看,本来能够让你更轻松的一个工具,如果不用实在是太可惜了。     DG Broker在数据库端需要启用一个后台进程dmon来维护,这个后台进程启动,需要设置dg_broker_start为true即可,如果要停
报名缘起   去年年底,崔老师发微信说12c OCM可以提上日程了。先不说那不菲的考试费用,单一个C(loud)就够我冷静一下了。最近几次参加线下分享活动,很多主题都离不开Cloud,听得云里雾里的。我问了一下自己,我可以吗?要不再等等吧。   过完年后,几个小伙伴蠢蠢欲动,看着朋友圈有朋友晒出的12c战袍还蛮帅的,走,报名去! 12c OCM考试号称“史上最难”   Oracle于2015年正式推出12c OCM升级考试,和以往的10g、11g OCM不同的是,12c OCM考试还要求考生每场达到最低分
  【 等待事件 】等待事件系列( 3+4 ) --System IO (控制文件) + 日志类等待   1    BLOG 文档结构图     2    前言部分   2.1    导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识, ~O(∩_∩)O~ : ①  控制文件类等待 ② 日志类等待   2.2    相关参考文章链接 【推荐】 等待事件系列(1)--User I/O类型(下) http://blog.itpub.net/26736162/v
今儿需要部署一个Oracle环境,为了简单些,选择了Oracle提供的Linux版本介质:OracleLinux-R6-U2-Server-x86_64-dvd.iso,在安装的过程中碰见了几个常见的问题,简要记录下,便于日后查找。 问题1:无法登陆图形界面   按照正常流程安装后,默认是没有安装图形界面的,因此进入的是命令行界面,若不用静默安装或克隆安装,则必须需要图形界面。于是按照常规做如下操作:  (1) 修改/etc/inittab中id:3:initdefault的3为5。  (2) start

【函数】wm_concat包的订制 - 2016-09-20 14:09:39

  【 函数 】 wm_concat 包的订制   1    BLOG 文档结构图     2    前言部分   2.1    导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识, ~O(∩_∩)O~ : ①  利用系统包创建 WM_CONCAT 函数 (重点) ② ORA-00904: "wm_concat":invalid identifier 错误解决 ③  订制自己的 WM_CONCAT 函数 ④  listagg 分析函数的使用 ⑤ ORA-0
数据迁移中有一种解决方案很有亮点,如果表的数据量大,迁移涉及的表不多,同时对于维护时间有要求的情况下,物化视图的prebuilt方式就是一种很不错的选择。 大体的步骤和方法如下: 假设源环境是test_source,目标环境是test_target 在源环境中test_source的操作如下: Create table test_mv as select *from all_objects  ; alter table test_mv modify(object_id primary key); creat

【MySQL】5.7新特性之六 - 2016-09-15 17:09:05

写在前面   本系列文章基于 5.7.12 版本讲述MySQL的新特性。从安装,文件结构,SQL ,优化 ,运维层面 复制,GITD等几个方面展开介绍 5.7 的新特性和功能。同时也建议大家跟踪官方blog和官方文档,以尽快知悉其新的变化。 6.1  优化(工具方面)增强   5.7 版本中如果一个会话正在执行sql,且该sql 是支持explain的,那么我们可以通过指定会话id,查看该sql的执行计划。 EXPLAIN  [ options ]   FOR  CONNECTION connection
工具用于查看指定时间内show global status指标的变化,能够帮助运维人员了解系统负载的走势 本工具在5.5 5.6 5.7中测试通过 源码我放在百度云盘了 http://pan.baidu.com/s/1mhIeKp6 源码一共5个文件 conmysql.c main.c findv.c other.c type.h 如果源码编译使用如下方法 1、建立一个MYSQL用户用于监控,不需要什么权限只要能够show global status 即可 mysql create user mmon@'l
本文以双节点RAC为例,揭示了在执行select及DML操作过程中,Cache Fusion在幕后是如何对block进行锁管理的。 ###实例1上查询scott.t0820_1表 select * from scott.t0820_1;         ID ----------          2 select dbms_rowid.rowid_relative_fno(rowid) rfno,dbms_rowid.rowid_block_number(rowid) blkno from scott.
【故障处理】队列等待之 enq: US - contention 案例 1    BLOG 文档结构图       2    前言部分 2.1    导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识, ~O(∩_∩)O~ : ① enq: US - contention 等待事件的解决 ② 一般等待事件的解决办法 ③ 队列等待的基本知识   Tips: ① 本文在 ITpub ( http://blog.itpub.net/26736162 )、博客园