Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

вторник, 7 июля 2009 г.

Удаление сессий в Oracle

Время от времени нам требуется создавать заново схему БД - это делается во время ночных билдов (nightly builds) в КруизКонтроле. Это, однако, невозможно, если остаются пользователи, подключенные в БД. Поэтому для создания схемы надо убить все сессии.

Приведенная ниже процедура убивает все сессии в Oracle:

CREATE OR REPLACE PROCEDURE Kill_User_Sessions(Usernames IN VARCHAR2)
AUTHID CURRENT_USER
IS
Stmt_Str VARCHAR2(200);
Sid_V VARCHAR2(30);
SerialNum_V VARCHAR2(30);
CURSOR pri IS
SELECT Sid, Serial#, Username
FROM v$session
WHERE Username IS NOT NULL
AND Username IN (Usernames)
AND Status NOT IN ('KILLED','SNIPED');
BEGIN
FOR usr IN pri
LOOP
Sid_V := usr.Sid;
SerialNum_V := Usr.Serial#;
Stmt_Str := 'ALTER SYSTEM KILL SESSION ''' || Sid_V || ',' || SerialNum_V || '''';
EXECUTE IMMEDIATE(stmt_str);
END LOOP;
END;

Она используется следующим образом:

CALL Kill_User_Sessions('username');

- где username - имя пользователя, сессии которого следует удалить.

Обратите внимание также на строчку AUTHID CURRENT_USER. Если задана опция AUTHID CURRENT_USER, то учитываются привилегии, данные через роль. Если не задана - т.е. по умолчанию DEFINER, то роли не учитываются.

Комментариев нет:

Отправить комментарий

Постоянные читатели