2013-03-27 2 views
31

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

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 

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

+0

отвечает может быть здесь: http://anilanbu.blogspot.com/2012/02/ora-01940-cannot-drop-user-that-is.html – Art

+0

Я пробовал это, но я не получаю никаких строк, когда пытался узнать сеансы. – Chaitanya

+1

Я узнал, почему я не получаю записи сеанса, где должно находиться условие username = 'TEST' – Chaitanya

ответ

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

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

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

Как бы вы автоматизировали это - одна команда? –

+6

@SkylarSaveland 'select 'alter system kill session' '' || sid || ',' || serial # || '' ';' из v $ session, где username = '' 'сделает это за вас. – bschlueter

+0

Для меня (Oracle 12c) в 'v $ session' не было записи ... – Betlista

17

Решение:

sql>Shutdown immediate; 

sql>startup restrict; 

sql>drop user TEST cascade; 

Если вы хотите, чтобы повторно активировать DB обычно либо сбросьте сервер или:

sql>Shutdown immediate; 

sql>startup; 

:)

+0

Это сработало для моего случая. – mwangi

+0

Фактическое лучшее решение. – Worthy7

+0

Вы также можете вернуть опцию RESTRICT, используя следующее: ALTER SYSTEM DISABLE RESTRICTED SESSION; – user3651293

0

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

1

Выполните запрос:

SELECT * FROM v$session s;

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

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

+0

Я не вижу разницы, сравнивая большинство проголосовавших ответов ... – Betlista

1

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

+0

Это сработало для меня. В моем случае это было oracleserviceXE – GabrielBB

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-с.и.д., 15-серийный - повторить команду для каждого возвращенной сессии предыдущей команды
3. Повторите шаги 1-2, пока select... не возвращается пустым таблица
4. Вызов drop user...

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

+0

Вы должны добавить комментарий к первому ответу. – Betlista

0

Вот как я «автоматизировать» Отбрасывание подключенных пользователей в базе данных 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 
0

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

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

sql>Shutdown immediate; 

sql>startup restrict; 

sql>drop user TEST cascade; 

То, что работало для меня в конце должна была войти в систему как пользователь, удалить все таблицы вручную - выберите для создания заявления капли

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

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

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

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

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

Может помочь кому-то еще.

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

Смежные вопросы