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

54

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

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

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

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

Теги:

7 ответов

92
Лучший ответ

Чтобы найти сеансы, как использование DBA

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')

Запрос, создающий готовые команды-убийцы, может быть

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

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

alter system kill session '375,64855';

alter system kill session '346,53146';

  • 0
    Я обнаружил, что в нашей среде RAC уничтожение сеанса часто приводило к зависанию, но поиск идентификатора процесса и удаление его из операционной системы всегда работали.
  • 4
    небольшое дополнение - добавьте немедленно к команде: select 'alter system kill session ''' || sid || ',' || serial# || ''' immediate;' from v$session where username = '<your_schema>'; это заставит команду
Показать ещё 1 комментарий
14

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

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

вы увидите что-то вроде ниже. Изображение 7156

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

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

Пример: ALTER SYSTEM KILL SESSION '93, 943 ';

7

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

DECLARE
   lc_username   VARCHAR2 (32) := 'your user name 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;
/
  • 2
    лучше записать оспид перед тем, как убивать сеансы, они могут застрять
1

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

disconnect; 

conn tiger/scott as sysdba;
1

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

  • 2
    Может быть проще и менее навязчиво заблокировать пользователя, которого он намеревается удалить, затем прекратить все связанные сеансы этого пользователя, затем отбросить его и создать заново. Не нужно излишне ограничивать доступ другим пользователям.
0

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

Установка Oracle на станции-разработчике стала без проблем с Oracle Database 10g Express Edition.

  • 0
    Только для Windows и некоторых разновидностей Linux.
  • 0
    Это на самом деле не имеет отношения к вопросу?
Показать ещё 1 комментарий
0

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

ALTER SCHEMA KILL SESSION sid, серийный номер;;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню