oracle下session的查询与删除

oracle下session的查询与删除

1、查询当前session

SQL> select username,sid,serial# from v$session where username is not null;


USERNAME                              SID    SERIAL#
------------------------------ ---------- ----------
SYS                                   144          4
HYL                                   146         48
SCOTT                                 147         64
HR                                    159         15
--SERIAL#:SID有可能会反复,当两个session的SID反复时,SERIAL#用来差别session

2、删除当前session

SQL> alter system kill session '146,48';
System altered.


hyl的session下运行操作例如以下:


SQL> show user
USER is "HYL"
SQL> select * from test1;
select * from test1
*
ERROR at line 1:
ORA-00028: your session has been killed

3、删除当前session的用户

思路:先关闭session,然后再删除用户


演示:在不关闭session的情况下删除用户现象:

SQL> select username,account_status from dba_users;
--查看当前有哪些用户
USERNAME                       ACCOUNT_STATUS
------------------------------ --------------------------------
CSMIG                          OPEN
MGMT_VIEW                      OPEN
SYS                            OPEN
SYSTEM                         OPEN
HYL                            OPEN
OE                             EXPIRED & LOCKED
6 rows selected.


SQL> select username,sid,serial# from v$session where username is not null;
--通过v$session视图,查看会话的sid、serial#
USERNAME                              SID    SERIAL#
------------------------------ ---------- ----------
SYS                                   144          4
HYL                                   146         54
SCOTT                                 147         64
HR                                    159         15


SQL> drop user hyl;       --删除,报错了。表明会话中存在的用户是不能被删除的,须要先将其关闭
drop user hyl
*
ERROR at line 1:
ORA-01940: cannot drop a user that is currently connected

SQL> alter system kill session '146,54';
System altered.


--hyl的session下查看数据。信息显示该session已经被kill掉,表明删除session成功
SQL> select * from test1;
select * from test1
*
ERROR at line 1:
ORA-00028: your session has been killed


--以下完毕删除用户
SQL> drop user hyl;   --删除用户报错了,此时hyl用户下有对象存在
drop user hyl
*
ERROR at line 1:
ORA-01922: CASCADE must be specified to drop 'HYL'


SQL> drop user hyl cascade; --将用户及其所有对象所有删除
User dropped.


--尝试hyl连接。报错。无法使用hyl登陆session
SQL> conn hyl/oracle
ERROR:
ORA-01017: invalid username/password; logon denied


Warning: You are no longer connected to ORACLE.


--查看dba_users数据字典。表明hyl用户已经被删除
SQL> select username,account_status from dba_users;


USERNAME                       ACCOUNT_STATUS
------------------------------ --------------------------------
CSMIG                          OPEN
MGMT_VIEW                      OPEN
SYS                            OPEN
SYSTEM                         OPEN
OE                             EXPIRED & LOCKED
5 rows selected.


小结:


查询当前会话:select username,sid,serial# from v$session where username is not null;
删除当前会话:alter system kill session 'sid,serial#';
删除当前会话的用户,先kill session,再drop user(若用户下有对象,使用cascade命令)



——————————————————————————————————————————————————————————————————————

补充:username为空


--补充:查询会话时不加入“username is not null”条件时,会出现username为空的session信息
SQL> select username,sid,serial# from v$session;


USERNAME                              SID    SERIAL#
------------------------------ ---------- ----------
SYS                                   144          4
SCOTT                                 147         64
                                      149          2
                                      153        346
                                      154          1
                                      158          7
HR                                    159         15
                                      160          1
                                      161          1
                                      162          1
                                      163          1
                                      164          1
                                      165          1
                                      166          1
                                      167          1
                                      168          1
                                      169          1
                                      170          1
18 rows selected.


说明:
oracle对于username的原则:
Oracle内部进程的user#为0时,则username为空;
Oracle内部进程的username为空时,则user#为0。
username、user#两个字段都是属于表示用户的字段。




由上得出例如以下:
前台进程是属于某个数据库用户的,所曾经台进程的user#不为0,username不为空;
而后台进程不属于不论什么数据库用户。所以后台进程的user#为0,username为空。


小结:
     

    用户仅仅能使用server进程(前台进程)。不能使用后台进程,而前台进程和后台进程session能够相应,所以在v$session中username为空(即user#为0)。


--补充完成

——————————————————————————————————————————————————————————————————————



***********************************************声明************************************************ 

原创作品,出自 “深蓝的blog” 博客。欢迎转载,转载时请务必注明出处(http://blog.csdn.net/huangyanlong)。

表述有错误之处。请您留言,不胜感激。

提醒:点击文件夹,更有助于您的查看。

*****************************************************************************************************












原文地址:https://www.cnblogs.com/yfceshi/p/6856250.html