Как убить собственные Oracle SQL сеансы без прав администратора? - PullRequest
3 голосов
/ 20 марта 2020

Есть ли у пользователя способ прекратить собственную сессию / соединения при наличии Oracle SID без прав администратора?

В частности, я могу запустить это в своей БД без прав администратора:

SELECT SID, "SERIAL#", STATUS, USERNAME
 FROM V$SESSION
 WHERE 
 (USERNAME = 'LastF') 
 AND
 (STATUS = 'INACTIVE');

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

ALTER SYSTEM KILL SESSION "12, 123"

я получаю следующее:

JDBC ERROR: ORA-01031: insufficient privileges

Примечание: я соединяюсь с JDB C через R / Rstudio с использованием пакета RJDB C.

Мотивация:

Не кажется слишком сложным убивать сессии в Oracle SQL: https://docs.oracle.com/cd/B28359_01/server.111/b28310/manproc008.htm#ADMIN11192
Как убить все сеансы, подключенные к моей базе данных oracle?

Однако для не Пользователи DBA, у которых есть потерянные соединения (например, отключение inte rnet, сторонний клиент, который устраняет ошибки соединения и т. Д. c), могут быть очень разочарованы, получив:

ORA-02391 exceeded simultaneous SESSIONS_PER_USER limit

и вынуждены ждать на время ожидания.

Ответы [ 2 ]

6 голосов
/ 20 марта 2020

Чтобы успешно выполнить команду ALTER SYSTEM, вам не нужно быть администратором базы данных, но вам do необходимо предоставить привилегию ALTER SYSTEM вам (или "пользователю", владеющему приложение, через которое вы подключаетесь к базе данных - которое может отличаться от «вы» как «пользователь» RStudio).

У вас есть несколько вариантов:

  • спросить Администратор базы данных для прекращения сеанса
  • просит предоставить ему привилегию ALTER SYSTEM (что является очень плохой практикой)
  • имеет "руководителя" (как бы он ни был определен - ответственный конкретно за эти ситуации) предоставил привилегию ALTER SYSTEM, которая будет отвечать за уничтожение таких сеансов
  • (возможно, лучший вариант) создать упакованную процедуру, единственной задачей которой является уничтожение потерянных сеансов. Предоставьте ALTER SYSTEM владельцу пакета и предоставьте право на выполнение этого пакета отдельным пользователям (при необходимости). Процедура должна быть написана для уничтожения только определенных c видов сеансов.
0 голосов
/ 21 марта 2020

Вы можете использовать ниже, чтобы отменить все, что работает в сеансе

    DECLARE
      l_status  v$session.status%TYPE;
    BEGIN

      dbms_system.set_ev( &sid, &serial, 10237, 1, '');

      LOOP
        SELECT status INTO l_status FROM v$session
          WHERE sid = &sid and serial# = &serial;
        EXIT WHEN l_status='INACTIVE';
      END LOOP;

      dbms_system.set_ev( &sid, &serial, 10237, 0, '');
    END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...