Универсальный скрипт отстрела всех сессий
Это скрипт на языке 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, чтобы уничтожить сеанс.