我想使用sqlplus删除Oracle DB中的一些用户但是我收到错误:
SQL> DROP USER test CASCADE;
DROP USER test CASCADE
*
ERROR at line 1:
ORA-01940: cannot drop a user that is currently connected
Run Code Online (Sandbox Code Playgroud)
我按照SO中的链接查找会话 - 从Oracle 10g数据库架构中删除已连接的用户
但是当我运行命令时,我没有得到任何结果:
SQL> select sid,serial# from v$session where username = 'test';
no rows selected
Run Code Online (Sandbox Code Playgroud)
在这种情况下,请帮助我如何删除用户.
Art*_*Art 69
用户都是v$session(和数据字典视图)中的大写字母.如果你与大写字母匹配,你应该找到你要杀的会话.
SELECT s.sid, s.serial#, s.status, p.spid
FROM v$session s, v$process p
WHERE s.username = 'TEST' --<<<--
AND p.addr(+) = s.paddr
/
Run Code Online (Sandbox Code Playgroud)
为用户TEST传递实际的SID和SERIAL#值,然后删除用户...:
ALTER SYSTEM KILL SESSION '<SID>, <SERIAL>'
/
Run Code Online (Sandbox Code Playgroud)
小智 30
方案:
sqlplus / as sysdba
Run Code Online (Sandbox Code Playgroud)
如果要重新激活DB,请重置服务器或:
sql>Shutdown immediate;
sql>startup restrict;
sql>drop user TEST cascade;
Run Code Online (Sandbox Code Playgroud)
:)
小智 7
问题已使用以下程序修复:
DECLARE
v_user_exists NUMBER;
user_name CONSTANT varchar2(20) := 'SCOTT';
BEGIN
LOOP
FOR c IN (SELECT s.sid, s.serial# FROM v$session s WHERE upper(s.username) = user_name)
LOOP
EXECUTE IMMEDIATE
'alter system kill session ''' || c.sid || ',' || c.serial# || ''' IMMEDIATE';
END LOOP;
BEGIN
EXECUTE IMMEDIATE 'drop user ' || user_name || ' cascade';
EXCEPTION WHEN OTHERS THEN
IF (SQLCODE = -1940) THEN
NULL;
ELSE
RAISE;
END IF;
END;
BEGIN
SELECT COUNT(*) INTO v_user_exists FROM dba_users WHERE username = user_name;
EXIT WHEN v_user_exists = 0;
END;
END LOOP;
END;
/
Run Code Online (Sandbox Code Playgroud)
做一个查询:
SELECT * FROM v$session s;
找到您的用户并执行下一个查询(使用适当的参数):
ALTER SYSTEM KILL SESSION '<SID>, <SERIAL>';