Универсальный скрипт отстрела всех сессий

Last modified by Александр Таболин on 2023/11/03 23:12

Это скрипт на языке PL/SQL, который используется для работы с базами данных Oracle. Скрипт предназначен для уничтожения всех сеансов того же кассира, которые имеют транзакцию более двух минут и неактивны тоже более двух минут.
 

begin
  for cSes in
  ( select
      s.sid
    /*, s.serial#
    , s.module, s.program
    , s.action, s.client_info
    , (sysdate-t.start_date) day(3) to second(0) as
tran_dur*/
    from v$session me, v$session s, v$transaction t
    where me.sid = sys_context('userenv', 'sid')  я
      and s.username = me.username  та же схема
      and decode(s.client_info, me.client_info, '=') = '='
 тот же пользователь программы
      and s.status = 'INACTIVE'  неактивная сессия
      and t.addr = s.taddr       есть транзакция
      and (sysdate-t.start_date) day(3) to second(0) >
interval '2' minute  длительность транзакции
      and s.LAST_CALL_ET/60 > 2   длительность неактивности (минут)
  ) loop
    dbms_output.put_line('Killing sid='||cSes.sid);
    un$adm.autokill(p_sid=>cSes.sid, p_force=>true);
  end loop;
end;

Скрипт использует следующие объекты и функции:

•  v$session - это представление, которое содержит информацию о текущих сеансах базы данных, такую как идентификатор сеанса (sid), имя пользователя (username), статус сеанса (status), информация о клиенте (client_info) и т.д.

•  v$transaction - это представление, которое содержит информацию о текущих транзакциях базы данных, такую как адрес транзакции (addr), дата начала транзакции (start_date) и т.д.

•  sys_context - это функция, которая возвращает значение атрибута контекста, такого как идентификатор текущего сеанса (sid) или имя текущего пользователя (user).

•  decode - это функция, которая сравнивает два значения и возвращает третье значение в зависимости от результата сравнения. Например, decode(s.client_info, me.client_info, '=') возвращает '=', если значения s.client_info и me.client_info равны, и null, если они не равны.

•  interval - это тип данных, который представляет собой интервал времени, такой как '2' minute или '3' hour. Интервалы можно использовать для вычисления разницы между двумя датами или для добавления или вычитания интервалов к датам.

•  dbms_output.put_line - это процедура, которая выводит строку в стандартный выходной поток. Это может быть полезно для отладки или логирования скриптов.

•  un$adm.autokill - это процедура, которая уничтожает сеанс по его идентификатору (p_sid) и принимает параметр p_force, который указывает, нужно ли принудительно завершить сеанс или нет.

Скрипт работает следующим образом:

•  Сначала он находит идентификатор текущего сеанса (me.sid) с помощью функции sys_context.

•  Затем он выбирает все сеансы, которые удовлетворяют следующим условиям:

•  Они имеют то же имя пользователя (s.username), что и текущий сеанс.

•  Они имеют ту же информацию о клиенте (s.client_info), что и текущий сеанс. Это может означать, что они принадлежат тому же кассиру.

•  Они неактивны (s.status = 'INACTIVE').

•  Они имеют транзакцию (t.addr = s.taddr).

•  Длительность транзакции больше двух минут ((sysdate-t.start_date) day(3) to second(0) > interval '2' minute).

•  Длительность неактивности больше двух минут (s.LAST_CALL_ET/60 > 2).

•  Для каждого такого сеанса он выводит его идентификатор (cSes.sid) с помощью процедуры dbms_output.put_line и вызывает процедуру un$adm.autokill с параметрами p_sid=cSes.sid и p_force=true, чтобы уничтожить сеанс.