Удаление подключенного пользователя из схемы базы данных Oracle 10g - PullRequest
60 голосов
/ 17 сентября 2008

Есть ли лучший способ принудительно отключить всех пользователей от схемы базы данных Oracle 10g, чем перезапуск служб базы данных Oracle?

У нас есть несколько разработчиков, использующих SQL Developer, подключающихся к одной и той же схеме на одном сервере Oracle 10g. Проблема в том, что когда мы хотим удалить схему, чтобы восстановить ее, неизбежно кто-то все еще подключен, и мы не можем удалить схему базы данных или пользователя, пока кто-то еще подключен.

Точно так же мы не хотим отбрасывать все соединения с другими схемами, потому что другие люди все еще могут быть подключены и тестировать с этими схемами.

Кто-нибудь знает быстрый способ решить эту проблему?

Ответы [ 7 ]

103 голосов
/ 17 сентября 2008

Чтобы найти сеансы, в качестве администратора баз данных используйте

select sid,serial# from v$session where username = '<your_schema>'

Если вы хотите быть уверены, что получите только сеансы, использующие SQL Developer, вы можете добавить and program = 'SQL Developer'. Если вы хотите уничтожить только сеансы, принадлежащие конкретному разработчику, вы можете добавить ограничение на os_user

Тогда убейте их с помощью

alter system kill session '<sid>,<serial#>'

(например, alter system kill session '39,1232')

Запрос, который производит готовые операторы kill, может быть

select 'alter system kill session ''' || sid || ',' || serial# || ''';' from v$session where username = '<your_schema>'

Это вернет один оператор kill за сеанс для этого пользователя - что-то вроде:

alter system kill session '375,64855';

alter system kill session '346,53146';

17 голосов
/ 20 мая 2013

Найти существующие сеансы в БД, используя этот запрос:

SELECT s.inst_id,
       s.sid,
       s.serial#,
       p.spid,
       s.username,
       s.program
FROM   gv$session s
       JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE  s.type != 'BACKGROUND';

вы увидите что-то вроде ниже. Oracle Sessions

Затем выполните запрос ниже со значениями, извлеченными из результатов выше.

ALTER SYSTEM KILL SESSION '<put above s.sid here>,<put above s.serial# here>';

Ex: СЕССИЯ ПО УБИЙСТВЕ ALTER SYSTEM 93, 943; 1011 *

9 голосов
/ 10 декабря 2013

Мое предложение - это простой анонимный блок:

DECLARE
   lc_username   VARCHAR2 (32) := 'user-name-to-kill-here';
BEGIN
   FOR ln_cur IN (SELECT sid, serial# FROM v$session WHERE username = lc_username)
   LOOP
      EXECUTE IMMEDIATE ('ALTER SYSTEM KILL SESSION ''' || ln_cur.sid || ',' || ln_cur.serial# || ''' IMMEDIATE');
   END LOOP;
END;
/
1 голос
/ 23 февраля 2012

просто используйте SQL:

disconnect; 

conn tiger/scott as sysdba;
1 голос
/ 23 сентября 2008

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

0 голосов
/ 19 сентября 2008

Только мои два цента: лучший способ (но, вероятно, не самый быстрый в краткосрочной перспективе), вероятно, состоит в том, чтобы каждый разработчик работал над своим собственным экземпляром базы данных (см. правило № 1 для работы с базой данных ) .

Установка Oracle на станцию ​​разработчика стала легкой задачей с Oracle Database 10g Express Edition .

0 голосов
/ 17 сентября 2008

Вы пробовали ALTER SYSTEM KILL SESSION? Получите SID и SERIAL # из V $ SESSION для каждого сеанса в данной схеме, затем выполните

ALTER SCHEMA KILL SESSION sid , serial # ;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...