Show last authors
1 Это скрипт на языке PL/SQL, который используется для работы с базами данных Oracle. Скрипт предназначен для уничтожения всех сеансов того же кассира, которые имеют транзакцию более двух минут и неактивны тоже более двух минут.
2
3 (% style="font-size: 14px; font-family: Consolas; background-color:#fbfdff" %)
4 begin
5 for cSes in
6 ( select
7 s.sid
8 /*, s.serial#
9 , s.module, s.program
10 , s.action, s.client_info
11 , (sysdate-t.start_date) day(3) to second(0) as
12 tran_dur*/
13 from v$session me, v$session s, v$transaction t
14 where me.sid = sys_context('userenv', 'sid') -- я--
15 and s.username = me.username -- та же схема--
16 and decode(s.client_info, me.client_info, '=') = '='
17 -- тот же пользователь программы--
18 and s.status = 'INACTIVE' -- неактивная сессия--
19 and t.addr = s.taddr -- есть транзакция--
20 and (sysdate-t.start_date) day(3) to second(0) >
21 interval '2' minute -- длительность транзакции--
22 and s.LAST_CALL_ET/60 > 2 -- длительность неактивности (минут)--
23 ) loop
24 dbms_output.put_line('Killing sid='||cSes.sid);
25 un$adm.autokill(p_sid=>cSes.sid, p_force=>true);
26 end loop;
27 end;
28
29
30 Скрипт использует следующие объекты и функции:
31
32 • v$session - это представление, которое содержит информацию о текущих сеансах базы данных, такую как идентификатор сеанса (sid), имя пользователя (username), статус сеанса (status), информация о клиенте (client_info) и т.д.
33
34 • v$transaction - это представление, которое содержит информацию о текущих транзакциях базы данных, такую как адрес транзакции (addr), дата начала транзакции (start_date) и т.д.
35
36 • sys_context - это функция, которая возвращает значение атрибута контекста, такого как идентификатор текущего сеанса (sid) или имя текущего пользователя (user).
37
38 • decode - это функция, которая сравнивает два значения и возвращает третье значение в зависимости от результата сравнения. Например, decode(s.client_info, me.client_info, '=') возвращает '=', если значения s.client_info и me.client_info равны, и null, если они не равны.
39
40 • interval - это тип данных, который представляет собой интервал времени, такой как '2' minute или '3' hour. Интервалы можно использовать для вычисления разницы между двумя датами или для добавления или вычитания интервалов к датам.
41
42 • dbms_output.put_line - это процедура, которая выводит строку в стандартный выходной поток. Это может быть полезно для отладки или логирования скриптов.
43
44 • un$adm.autokill - это процедура, которая уничтожает сеанс по его идентификатору (p_sid) и принимает параметр p_force, который указывает, нужно ли принудительно завершить сеанс или нет.
45
46 Скрипт работает следующим образом:
47
48 • Сначала он находит идентификатор текущего сеанса (me.sid) с помощью функции sys_context.
49
50 • Затем он выбирает все сеансы, которые удовлетворяют следующим условиям:
51
52 • Они имеют то же имя пользователя (s.username), что и текущий сеанс.
53
54 • Они имеют ту же информацию о клиенте (s.client_info), что и текущий сеанс. Это может означать, что они принадлежат тому же кассиру.
55
56 • Они неактивны (s.status = 'INACTIVE').
57
58 • Они имеют транзакцию (t.addr = s.taddr).
59
60 • Длительность транзакции больше двух минут ((sysdate-t.start_date) day(3) to second(0) > interval '2' minute).
61
62 • Длительность неактивности больше двух минут (s.LAST_CALL_ET/60 > 2).
63
64 • Для каждого такого сеанса он выводит его идентификатор (cSes.sid) с помощью процедуры dbms_output.put_line и вызывает процедуру un$adm.autokill с параметрами p_sid=cSes.sid и p_force=true, чтобы уничтожить сеанс.