Подтвердить что ты не робот

Удаление подключенных пользователей в базе данных Oracle

Я хочу удалить некоторых пользователей в Oracle DB с помощью sqlplus, но я получаю ошибку:

SQL> DROP USER test CASCADE;
DROP USER test CASCADE
*
ERROR at line 1:
ORA-01940: cannot drop a user that is currently connected

Я пошел по ссылке в SO, чтобы узнать о сеансах - Удаление подключенного пользователя из схемы базы данных Oracle 10g

Но когда я запустил команду, я не получаю никаких результатов:

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

no rows selected

Пожалуйста, помогите мне, как удалить пользователей в этом случае.

4b9b3361

Ответ 1

Все пользователи являются прописными в 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
 /

Передайте фактические значения SID и SERIAL # для пользователя TEST, затем удалите пользователя...:

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

Ответ 2

Решение:

войдите как sysdaba:

sqlplus  / as sysdba

затем:

sql>Shutdown immediate;

sql>startup restrict;

sql>drop user TEST cascade;

Если вы хотите повторно активировать БД в обычном режиме, либо перезагрузите сервер, либо:

sql>Shutdown immediate;

sql>startup;

:)

Ответ 3

Сделайте запрос:

SELECT * FROM v$session s;

Найдите своего пользователя и выполните следующий запрос (с соответствующими параметрами):

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

Ответ 4

Проблема была устранена с помощью следующей процедуры:

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;
/

Ответ 5

перейти к сервисам в инструментах администрирования и выбрать oracleserviceSID и перезапустить его

Ответ 6

У меня была одна и та же проблема, Oracle config по умолчанию затрагивает буквенный регистр. В точности мое имя Scheme_Name было написано всеми прописными буквами. Вы можете увидеть свое имя Scheme_Name на вкладке "Другие пользователи", если вы используете Oracle S

Ответ 7

Я пытался следить за описанным здесь потоком, но не успел полностью убить сеанс. Затем я хотел бы добавить дополнительный шаг:
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>'; - как описано ниже.
Out put будет примерно таким:
alter system kill session '22,15' immediate;
 2. alter system disconnect session '22,15' IMMEDIATE ; - 22-sid, 15-serial - повторите команду для каждого возвращенного сеанса из предыдущей команды
  3. Повторите шаги 1-2, пока select... не вернет пустую таблицу
  4. Вызов   drop user...

Что было пропущено - вызовите alter system disconnect session '22,15' IMMEDIATE ; для каждого сеанса, возвращенного select 'alter system kill session '..

Ответ 8

В основном я считаю, что убийство всех сеансов должно быть решением, но...

Я нашел аналогичную дискуссию - https://community.oracle.com/thread/1054062 к моей проблеме, и у меня не было сеансов для этих пользователей, но я все еще получал ошибка. Я попробовал и второй лучший ответ:

sql>Shutdown immediate;

sql>startup restrict;

sql>drop user TEST cascade;

Что работало для меня в конце, так это входить в систему как пользователь, отбросить все таблицы вручную - выбрать для создания операторов drop

select 'drop table ' || TABLE_NAME || ';'  from user_tables;

(Требуется повторное повторное выполнение из-за ссылок)

Я понятия не имею, как это связано, я бросил также функции и последовательности (потому что это было все, что у меня было в схеме)

Когда я это сделал, и я вышел из системы, у меня было несколько сеансов в таблице v$session, и когда я убил тех, кого я смог удалить.

Моя БД все еще запускалась в ограниченном режиме (не уверен, важна или нет).

Может помочь кому-то другому.

BTW: моя версия Oracle Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

Ответ 9

У кого-нибудь есть скрипт для удаления подключенного пользователя и создания с тем же именем и паролем снова пустым.

Ответ 10

Вот как я "автоматизирую" Удаление связанных пользователей в базе данных 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