56

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

SO のリンクをたどってセッションを見つけました - Dropping a connected user from an Oracle 10g database schema

しかし、コマンドを実行しても結果が得られません:

SQL> select sid,serial# from v$session where username = 'test';

no rows selected

この場合、ユーザーを削除する方法を教えてください。

4

13 に答える 13

80

ユーザーはすべて大文字です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
 /

ユーザー TEST の実際の SID および SERIAL# 値を渡し、ユーザーを削除します...:

ALTER SYSTEM KILL SESSION '<SID>, <SERIAL>'
/
于 2013-03-27T17:40:52.493 に答える
8

問題は、以下の手順を使用して修正されました。

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;
/
于 2018-06-06T03:30:43.557 に答える
1

ここで説明されているフローに従おうとしましたが、セッションを完全に終了させることはできませんでした..次に、ここで追加のステップが好きです:
http://wyding.blogspot.com/2013/08/solution-for-ora-01940 -cannot-drop-user.html

私がしたこと:
1. select 'alter system kill session ''' || sid || ',' || serial# || ''';' from v$session where username = '<your_schema>';- 以下で説明するように。
出力は次のようになります:
alter system kill session '22,15' immediate;
2. alter system disconnect session '22,15' IMMEDIATE ;- 22-sid, 15-serial - 前のコマンドから返されたセッションごとにコマンドを繰り返します 3.空のテーブルを返さない
間、手順 1 ~ 2 を繰り返します 4. 呼び出し ますselect...
drop user...

見逃されたもの -alter system disconnect session '22,15' IMMEDIATE ;によって返された各セッションの呼び出しselect 'alter system kill session '..

于 2015-12-02T18:49:54.977 に答える
0

私は同じ問題を抱えていました。デフォルトのOracle構成は文字登録に影響します。正確には、Scheme_Name はすべて大文字で書かれていました。Oracle S を使用している場合は、「その他のユーザー」タブで Scheme_Name を確認できます。

于 2014-08-15T05:50:17.893 に答える
-1

Oracleデータベースで接続ユーザーの削除を「自動化」する方法は次のとおりです。

# A shell script to Drop a Database Schema, forcing off any Connected Sessions (for example, before an Import) 
# Warning! With great power comes great responsibility.
# It is often advisable to take an Export before Dropping a Schema

if [ "$1" = "" ] 
then
    echo "Which Schema?"
    read schema
else
    echo "Are you sure? (y/n)"
    read reply
    [ ! $reply = y ] && return 1
    schema=$1
fi

sqlplus / as sysdba <<EOF
set echo on
alter user $schema account lock;
-- Exterminate all sessions!
begin     
  for x in ( select sid, serial# from v\$session where username=upper('$schema') )
  loop  
   execute immediate ( 'alter system kill session '''|| x.Sid || ',' || x.Serial# || ''' immediate' );  
  end loop;  
  dbms_lock.sleep( seconds => 2 ); -- Prevent ORA-01940: cannot drop a user that is currently connected
end;
/
drop user $schema cascade;
quit
EOF
于 2016-03-23T16:02:25.490 に答える