今天在现场作业时,需要先删除用户;在执行
drop user
时提示“ORA-01940: cannot drop a user that is currently connected”,当时的环境如下:
操作系统:Windows XP
数据库:Oracle 10.2.0.1
当时时间比较着急,直接采取了釜底抽薪的办法——拔网线,这招很管用,再次执行drop user就成功了。考虑到以后不一定所有场合都允许你采取这种简单粗暴的办法,就在虚拟机上重现了这个报错,寻求一种较为温和的解决办法。
首先我打开两个虚拟机,在1号虚拟机上启动了两个实例,打开了3个连接到scott用户的窗口;在2号虚拟机上启动了一个实例,打开了一个连接到scott用户的窗口。这时我登录sys用户执行drop user操作,复现了上述报错。
-
[
oracle
@
enmoedu1
~
]
$
sqlplus
/
as
sysdba
-
-
SQL
*
Plus
:
Release
11
.
2
.
.
3
.
0 Production
on
Fri Apr 17 21
:
25
:
40 2015
-
-
Copyright
(
c
)
1982
,
2011
,
Oracle
.
All
rights reserved
.
-
-
-
Connected
to
:
-
Oracle
Database
11g Enterprise Edition
Release
11
.
2
.
.
3
.
0
-
Production
-
With
the Partitioning
,
OLAP
,
Data
Mining
and
Real
Application Testing options
-
-
SQL
>
drop
user
scott
cascade
;
-
drop
user
scott
cascade
-
*
-
ERROR at line 1
:
-
ORA
-
01940
:
cannot
drop
a
user
that
is
currently connected
-
-
-
SQL
>
首先,我们查看scott用户的连接状况;
-
SQL
>
select
username
,
sid
,
serial#
from
v$
session
where
username
=
'SCOTT'
;
-
-
USERNAME SID SERIAL#
-
------------------------------ ---------- ----------
-
SCOTT 19 355
-
SCOTT 20 13693
-
SCOTT 26 15
-
SCOTT 127 7
-
-
SQL
>
接下来,我们kill上述连接;
-
SQL
>
alter
system kill
session
'19,355'
;
-
-
System altered
.
-
-
SQL
>
alter
system kill
session
'20,13693'
;
-
-
System altered
.
-
-
SQL
>
alter
system kill
session
'26,15'
;
-
-
System altered
.
-
-
SQL
>
alter
system kill
session
'127,7'
;
-
-
System altered
.
-
-
SQL
>
再次查询scott用户的连接状况,确认所有连接被清除完毕;
-
SQL
>
-
SQL
>
select
username
,
sid
,
serial#
from
v$
session
where
username
=
'SCOTT'
;
-
-
USERNAME SID SERIAL#
-
------------------------------ ---------- ----------
-
SCOTT 19 355
-
SCOTT 20 13693
-
SCOTT 26 15
-
SCOTT 127 7
-
-
SQL
>
看到这儿,不要惊慌,不要以为这些连接还在;我们只要查询一下上述连接的状态就明白了。
-
SQL
>
-
SQL
>
select
saddr
,
sid
,
serial#
,
paddr
,
username
,
status
from
v$
session
where
username
is
not
null
;
-
-
SADDR SID SERIAL# PADDR USERNAME STATUS
-
-------- ---------- ---------- -------- ------------------------------ --------
-
578CC410 19 355 583AD258 SCOTT KILLED
-
578C9890 20 13693 583AD258 SCOTT KILLED
-
578B9390 26 15 583AD258 SCOTT KILLED
-
579DED90 120 95 5836FFB4 SYS ACTIVE
-
579CBD10 127 7 583AD258 SCOTT KILLED
-
-
SQL
>
由上述查询结果得知,scott用户的所有连接已经被kill了;现在我们执行drop user,看一下是否能够成功;
-
SQL
>
-
SQL
>
drop
user
scott
cascade
;
-
-
User
dropped
.
-
-
SQL
>
由此,ORA-01940报错得到顺利解决。大家如果以后碰到这个问题,可以按照实际环境来决定是采取“简单粗暴”的解决办法(拔网线),还是上述这种“温和”的解决办法。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69916968/viewspace-2641789/
,如需转载,请注明出处,否则将追究法律责任。