删除Oracle数据库中的已连接用户

Cha*_*nya 46 oracle

我想使用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)

  • @SkylarSaveland`select'alco system kill session'''|| sid || ','|| 序列#|| '' ';' 来自v $ session,其中username ='<your_schema>'`将为您完成. (9认同)
  • 你会如何自动化这个 - 一个命令? (2认同)

小智 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)

:)

  • 请重新启动服务器以删除帐户远非最佳解决方案.想想生产环境.这是一个非常糟糕的主意.为了防止用户在终止会话时重新连接,您可以先锁定帐户,然后使用该用户名终止所有会话,然后删除该帐户.无需为此重新启动服务器. (4认同)
  • 实际的最佳解决方案。 (2认同)
  • 您还可以使用以下方法还原RESTRICT选项:ALTER SYSTEM DISABLE RESTRICTED SESSION; (2认同)

小智 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)


Rom*_*hin 5

做一个查询:

SELECT * FROM v$session s;

找到您的用户并执行下一个查询(使用适当的参数):

ALTER SYSTEM KILL SESSION '<SID>, <SERIAL>';