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

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

 

1  BLOG文档结构图

 

 

2  前言部分

 

2.1  导读和注意事项

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

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

 

  Tips:

① 本文在itpub(http://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的最大归档日志号为33,thread 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的更多内容可以参考我的blog:http://blog.itpub.net/26736162/viewspace-2121019和http://blog.itpub.net/26736162/viewspace-2121020

 

2.3  本文简介

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

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

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

3  代码分享

代码实现过程如下:

 


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 ;--假设上一步查询出来的SID为1008,实例号为1

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

 

 

3.1  代码演示

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


[email protected]> 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

 

[email protected]> 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用户杀普通用户的会话


[email protected]> SELECT A.SID,A.SERIAL#,USERENV(‘INSTANCE‘),USERNAME FROM v$session a WHERE username=‘LHR‘;

 

       SID    SERIAL# USERENV(‘INSTANCE‘) USERNAME

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

        79      16453                   1 LHR

 

[email protected]>  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

[email protected]> conn lhr/lhr

Connected.

[email protected]> EXEC PRO_KILL_SESSION_LHR(1,79,16453);

 

PL/SQL procedure successfully completed.

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

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


[email protected]> SELECT A.SID,A.SERIAL#,USERENV(‘INSTANCE‘),USERNAME FROM v$session a WHERE username=‘LHRTEST‘;

 

       SID    SERIAL# USERENV(‘INSTANCE‘) USERNAME

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

       142      12947                   1 LHRTEST

 

[email protected]> 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


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

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

● 本文在itpub(http://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:20 在中行完成

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

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

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

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

 

时间: 2025-01-08 01:54:05

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

如何彻底杀掉不良用户会话

在ORACLE数据库当中,有时候会使用ALTER SYSTEM KILL SESSION 'sid,serial#'杀掉一个会话进程,但是使用这个SQL语句杀掉会话后,数据库并不会立即释放掉相关的资源,有时候你会发现锁定的资源很长时间也不会释放,即使会话状态为“KILLED”,依然会阻塞其它会话. 在ORACLE数据库杀掉会话进程有三种方式: 1: ALTER SYSTEM KILL SESSION 关于KILL SESSION Clause ,如下官方文档描述所示,alter system k

如何杀掉一个用户下的所有进程并drop掉这个用户

Copy the sample code below into a file named kill_drop_user.sql.Open SQL*Plus and connect as user SYS to your databaseSQL> CONNECT sys/[email protected] AS SYSDBACreate a user called TEST with password TESTSQL> GRANT connect, resource TO test IDENTI

使用mybatis开发Dao的原始方法,实现根据用户id查询一个用户信息 、根据用户名称模糊查询用户信息列表 、添加用户信息等功能

1.需求 将下边的功能实现Dao: 根据用户id查询一个用户信息 根据用户名称模糊查询用户信息列表 添加用户信息 2. 原始Dao开发方法需要程序员编写Dao接口和Dao实现类 3.User.xml映射文件的内容为: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "h

Linux进程的实际用户ID和有效用户ID

在Unix进程中涉及多个用户ID和用户组ID,包括如下: 1.实际用户ID和实际用户组ID:标识我是谁.也就是登录用户的uid和gid,比如我的Linux以simon登录,在Linux运行的所有的命令的实际用户ID都是simon的uid,实际用户组ID都是simon的gid(可以用id命令查看). 2.有效用户ID和有效用户组ID:进程用来决定我们对资源的访问权限.一般情况下,有效用户ID等于实际用户ID,有效用户组ID等于实际用户组ID.当设置-用户-ID(SUID)位设置,则有效用户ID等于

选择用户-显示已选用户

1介绍 选择用户是一个比较常用的功能,主要包含2个功能点(保存已选选项.显示已选用户) 功能要求: 1 选择用户界面以弹出框方式显示 2 页面选项动态加载(部门及用户) 3 已选用户以勾选方式显示 实现分析: 首先因为窗口是个弹出框,所以页面的内容主要是以异步方式获取.因为内容分为两个部分(1待选项.2选中项)所以就有两种处理方法. 方法1:后台根据数据(1待选项.2选中项)生成完整的html代码,通过一次异步操作返回 方法2:待选项.和选中项通过2次异步方法获取,然后在页面js事项选中效果.

无死角理解保存设置用户ID,设置用户ID位,有效用户ID,实际用户ID

最近在理解保存设置用户ID时,遇到一些问题,但是发现网上都没能把这个问题说清楚,通过自己的思考和查找资料,终于明白了,现在分享在这里共大家交流学习,如果有不正确的地方,欢迎指正 1,基本概念: 实际用户ID(RUID):用于标识一个系统中用户是谁,一般是在登录之后,就被唯一确定的,就是登陆的用户的uid 有效用户ID(EUID):用于系统决定用户对系统资源的权限.也就是说当用户做任何一个操作时,最终看它有没有权限,都是在判断有效用户ID是否有权限,如果有,则OK,否则报错不能执行.在正常情况下,

linux SFTP用户创建 不允许用户登录,并且连接只允许在制定的目录下进行操作

1.创建用户 groupadd sftp 2.添加用户并设置为sftp组 useradd -g sftp -s /sbin/nologin -M sftp    (/sbin/nologin为禁止登录shell的用户) 3.设置用户密码 passwd sftp 4.创建用户目录.并设置权限. cd /home mkdir sftp chown root:sftp sftp chmod 755 sftp 5.修改SSH配置 /etc/ssh/sshd_config 修改Subsystem Subs

RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-新增锁定用户与解除锁定用户的功能

锁定用户功能在现实应用场景中得到了大量的应用,当我们需要限制某用户的登录,又不能删除这个用户时就可以使用锁定功能,如:未授权的用户尝试错误密码错误过多可以尝试的用户进行锁定,又如ATM机上取钱时密码错误输入过多也会对当前用户进行锁定等其他非常多的应用场合. RDIFramework.NET V3.2版本新增了用户锁定与解除锁定的功能,当指定用户被锁定后,就不能进行登录了,只有解除锁定后才可以登录.锁定用户与解除锁定放在了用户授权管理界面中. 锁定用户与解除锁定用户可以调用框架提供的下面两个接口处

linux配置sftp用户的chroot步骤(用户的sftp根目录)

1.编辑ssh中的sftp的配置,命令可能是:vi /etc/ssh/sshd_config 在这个文件中最后加入 #限制sftp组的用户使用sftp时在自己的home目录下 Match Group sftp #这里写重写根目录成登录用户的根目录下 ChrootDirectory %h #这行指定使用sftp服务使用系统自带的internal-sftp ForceCommand    internal-sftp 2 重启ssh服务,命令可能是:service ssh restart, 这里要注意